Как добавить столбец NOT NULL FOREIGN KEY в существующую (заполненную) таблицу в MS SQL?

Мне нужно добавить столбец NOT NULL в существующую (заполненную) таблицу, которая будет внешним ключом для другой таблицы. Это приводит к двум проблемам:

  1. Когда вы добавляете столбец, его значение не может быть нулевым — использование значения по умолчанию не является вариантом (если только оно не будет удалено позже), потому что логика базы данных используется при проверке на стороне сервера, когда пользователь вводит новую запись, т. е. когда приложение пытается чтобы добавить запись с этим полем, имеющим нулевое значение, база данных выдает ошибку, которую приложение перехватывает и возвращает пользователю, предлагая исправить ее.

  2. Столбец имеет ограничение внешнего ключа, что означает, что его значение ДОЛЖНО существовать и во внешней таблице.

Каков наилучший способ сделать это?


person Jimbo    schedule 11.03.2010    source источник


Ответы (2)


Создайте столбец, но разрешите NULL. Заполните столбец правильными данными из таблицы внешнего ключа. Измените столбец, добавьте не нуль. Добавьте ограничение внешнего ключа.

person Kjetil Watnedal    schedule 11.03.2010
comment
Вы можете добавить столбец со значением по умолчанию, затем скопировать правильные данные, а затем удалить ограничение по умолчанию. Другой путь, то же количество шагов. Я не думаю, что станет еще круче. - person mwigdahl; 11.03.2010

О частях ваших вопросов (по прошествии многих лет):

1. Если вы имеете в виду, что значение по умолчанию будет таким умным, и вам не нужно будет его менять в будущем, то ваше желание неверно. Зачем?

по двум причинам:

  • a) В концепции значения по умолчанию (во всех языках программирования
    , базах данных и т. д.) значение по умолчанию — это не то, что динамически заменяет значение чем-то, что вы хотите. Например, Func Sum(a,b,c=10), в этой ситуации, если вы не введете параметр c, он примет его за 10, в противном случае вы должны ввести
    что-то вместо этого. поэтому значения по умолчанию являются предсказуемыми и вычисляемыми
    значениями, а НЕ интеллектуальными значениями.
  • b) Внешние ключи являются чем-то даже более важным, чем необязательный
    параметр в методе, из-за реляционных значений в РСУБД, поэтому вам, безусловно, следует редактировать это в будущем, даже, возможно, иногда оно меняется< br /> снова и снова на основе использования БД.

2. Это можно сделать с помощью кода, который я вам покажу.

Поэтому на основе этих объяснений у вас может быть столбец со значением по умолчанию, который существует в Fkeys, но это не то, что вам нужно, и вы должны обновлять его в будущем в зависимости от вашего использования. а для этого нужно:

ПЕРВЫЙ:

  • Создайте функцию, которая возвращает действительный и существующий внешний ключ конкретной таблицы, например:
CREATE FUNCTION SelectMinForeignKey()
RETURNS INT
AS
BEGIN
  DECLARE @FirstID INT
  SELECT @FirstID = MIN(ID) from DetailTableExample01
  RETURN @FirstID
END

ВТОРОЕ:

  • Затем вы должны изменить свою таблицу, чтобы добавить столбец следующим образом:
ALTER TABLE example1 ADD NoNullableCol INT NOT NULL DEFAULT [dbo].SelectMinForeignKey()
  • или с добавлением отношения мгновенно:
  ALTER TABLE example1 
    ADD NoNullableCol2 INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey() ,
    FOREIGN KEY(NoNullableCol2) REFERENCES DetailTableExample01(id);
  • или более полный с мгновенным добавлением ограничения и назначаемым именем FK:
ALTER TABLE dbo.example1 ADD
    NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey(),
    CONSTRAINT FK_example1_DetailTableExample01
    FOREIGN KEY (NoNullableCol) 
    REFERENCES dbo.DetailTableExample01 (ID) 
     ON UPDATE  CASCADE 
     ON DELETE  CASCADE;
  • or:
ALTER TABLE dbo.example1 ADD
    NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey()
GO
ALTER TABLE dbo.example1 ADD 
    CONSTRAINT FK_example1_DetailTableExample01
    FOREIGN KEY (NoNullableCol) 
    REFERENCES dbo.DetailTableExample01 (ID) 
     ON UPDATE  CASCADE 
     ON DELETE  CASCADE

ПРИМЕЧАНИЕ. Как вы знаете, имена таблиц и столбцов являются примерными.

ТРЕТИЙ:

  • Теперь вы должны изменить значения в NoNullableCol по своему усмотрению.

Все в одном:

  • Весь запрос будет примерно таким
CREATE FUNCTION SelectMinForeignKey()
RETURNS INT
AS
BEGIN
  DECLARE @FirstID INT
  SELECT @FirstID = MIN(ID) from DetailTableExample01
  RETURN @FirstID
END

GO

ALTER TABLE dbo.example1 ADD
    NoNullableCol INT NOT NULL  DEFAULT [dbo].SelectMinForeignKey(),
    CONSTRAINT FK_example1_DetailTableExample01
    FOREIGN KEY (NoNullableCol) 
    REFERENCES dbo.DetailTableExample01 (ID) 
     ON UPDATE  CASCADE 
     ON DELETE  CASCADE;

И Готово!

Надеюсь, это решит вашу проблему

person D4NTESPARDA    schedule 27.05.2017