SQL Server: Как я добавляю ограничение к существующей таблице, но только если ограничение уже не существует?

Вы пытаетесь

line = (gametag,score)
scores.write(line)

Итак, вы действительно пытаетесь write кортежировать.

Вы забыли трансформировать свой кортеж во что-то write -применимое.

Например: scores.write(f"(line)\n") или что-то подобное

13
задан jmatthias 13 February 2009 в 18:16
поделиться

2 ответа

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

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 ...
21
ответ дан 1 December 2019 в 20:13
поделиться

Я рекомендовал бы использовать представление 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'
8
ответ дан 1 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: