SQL Server: как добавить ограничение к существующей таблице, но только если ограничение еще не существует?
Мне нужно добавить ограничение к существующей таблице SQL-сервера, но только если оно еще не существует.
Я создаю ограничение, используя следующий SQL.
ALTER TABLE [Foo] ADD CONSTRAINT [FK_Foo_Bar] FOREIGN KEY ([BarId]) REFERENCES [Bar] ([BarId]) ON UPDATE CASCADE ON DELETE CASCADE
Я надеюсь, что я смогу добавить SQL для начала SQL, чтобы проверить наличие ограничения, но я понятия не имею, как это сделать.
Ответы
Ответ 1
Лично я бы снял существующее ограничение и пересоздал бы его - в случае, если уже существующее ограничение каким-то образом отличается
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyFKName]') AND OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE dbo.MyTableName DROP CONSTRAINT MyFKName
GO
ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
Текущий, более современный код, который я использую:
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[MyFKName]') AND parent_object_id = OBJECT_ID(N'[dbo].[MyTableName]'))
ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT [MyFKName]
GO
ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...
не уверен, есть ли какое-либо преимущество проверки sys.objects... или sys.foreign_keys... но в какой-то момент я выбрал sys.foreign_keys
Начиная с SQL2016, был добавлен новый синтаксис "IF EXISTS", который стал намного более читабельным:
-- For SQL2016 onwards:
ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT IF EXISTS [MyFKName]
GO
ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...
Ответ 2
Я бы рекомендовал использовать представление INFORMATION_SCHEMA.TABLE_CONSTRAINTS. Он переносится через разные двигатели базы данных:
SELECT COUNT(*)
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='Foo'
AND CONSTRAINT_NAME='FK_Foo_Bar'
AND CONSTRAINT_TYPE='FOREIGN KEY'
Ответ 3
Проверьте, существует ли ограничение, прежде чем добавлять его -
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_Foo_Bar')
BEGIN
ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
END
Ответ 4
Очень просто:
IF OBJECT_ID ('Schema.keyname') равен NULL
ALTER TABLE Schema.tablename ADD CONSTRAINT имя ключа...
Ответ 5
Alter table tableName add constraint constraintname default 0 for columnname
Вы можете предоставить имя ограничения, как хотите, без отдельной кавычки
Ответ 6
Снимите ограничение по умолчанию и создайте свой собственный. ALTER таблица TABLE_NAME ограничение на падение CONSTRAINT NAME
ИДТИ
ALTER TABLE [dbo]. [TABLE_NAME] ADD CONSTRAINT [DF_TABLE_NAME_COLUMN_NAME] ДЛЯ [COLUMN_NAME]