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

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

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

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

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

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

О некоторых частях ваших вопросов (из года в год):

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

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

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

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() 
  • или с добавлением Relation мгновенно:
  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; 
  • или:
 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; 

И это сделано!

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

  • Уникальный формат ограничения для неориентированного графика (1,2), предотвращения (2,1)
  • t-SQL - ограничение на один столбец с несколькими условиями
  • Поиск таблицы, к которой относится ограничение
  • Ограничение внешнего ключа может вызвать циклы или несколько каскадных путей?
  • Как представить этот тип отношений FK в SQL Server 2005?
  • Ограничение на несколько столбцов с определенными значениями
  • Почему zipcode не позволяет проверить ограничение?
  • Действительно ли `sp_executesql` действительно принимает аргумент` nvarchar (max)?
  • Как создать уникальное ограничение SQL на основе двух столбцов?
  • SQL удаляет автонамещенные ограничения
  • Проверить ограничение. Подзапросы в этом контексте запрещены.
  • Давайте будем гением компьютера.