SQL Server: как добавить ограничение к существующей таблице, но только если ограничение еще не существует? - PullRequest
12 голосов
/ 13 февраля 2009

Мне нужно добавить ограничение к существующей таблице сервера SQL, но только если она еще не существует.

Я создаю ограничение, используя следующий SQL.

ALTER TABLE [Foo] ADD CONSTRAINT [FK_Foo_Bar] FOREIGN KEY ([BarId]) REFERENCES [Bar] ([BarId]) ON UPDATE CASCADE ON DELETE CASCADE

Я надеюсь, что смогу добавить SQL в начало SQL, чтобы проверить наличие ограничения, но я не знаю, как.

Ответы [ 6 ]

20 голосов
/ 13 февраля 2009

Лично я бы отбросил существующее ограничение и пересоздал бы его - в случае, если уже существующее ограничение каким-то образом отличается

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, был добавлен новый синтаксис "ЕСЛИ СУЩЕСТВУЕТ", который стал намного более читабельным:

-- For SQL2016 onwards:
ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT IF EXISTS [MyFKName]
GO
ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...
8 голосов
/ 13 февраля 2009

Я бы рекомендовал использовать представление 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'
1 голос
/ 23 февраля 2018

Очень просто:

IF OBJECT_ID ('Schema.keyname') IS NULL

ALTER TABLE Schema.tablename ADD CONSTRAINT keyname ...

1 голос
/ 15 сентября 2016

Проверьте, существует ли ограничение, прежде чем добавить его -

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_Foo_Bar')
    BEGIN
    ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
    END
0 голосов
/ 08 октября 2014

Отбросьте ограничение по умолчанию и создайте свое собственное. Ограничение удаления таблицы TABLE_NAME таблицы ALTER CONSTRAINT NAME ИДТИ ALTER TABLE [dbo]. [TABLE_NAME] ADD CONSTRAINT [DF_TABLE_NAME_COLUMN_NAME] для [COLUMN_NAME]

0 голосов
/ 10 августа 2012
Alter table tableName add constraint constraintname default 0  for columnname

Вы можете предоставить ограничение как угодно без одинарных кавычек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...