Я пытаюсь обновить кучу разных таблиц в моей базе данных.
Однако, когда обновление завершено, я не могу удалить запись из другой таблицы из-за ограничения внешнего ключа. Тем не менее, другие базы данных на разных серверах примут изменения просто отлично. И после создания нового нового БД и применения к нему серии сценариев обновления для предварительного заполнения данных он также не работает.
Это должен быть SQL Server 2016.
У меня была попытка коллеги перестроить индексы и обновить использование, но она все еще не удалась.
--- Query 1
SELECT ROW_NUMBER() OVER(ORDER BY c.[name], t.[name]),
SCHEMA_NAME(t.schema_id) AS SchemaName,
c.[name] AS ColName,
t.[name] AS TableName
FROM sys.columns c
JOIN sys.tables t ON c.object_id = t.object_id
WHERE c.[name] IN (...)
AND t.[name] NOT IN (...)
ORDER BY ColName, TableName
Я выбираю коллекцию схем, столбцов и таблиц, которые соответствуют моим критериям, и генерирую динамический SQL для каждой комбинации.
--- Query 2
SET @sql = 'UPDATE ' + @schemaName + '.' + @tableName + ' SET ' + @colName + ' = ' + CONVERT(NVARCHAR, @p1) + ' WHERE ' + @colName + ' = ' + CONVERT(NVARCHAR, @p2)
Большинство / все таблицы, возвращаемые запросом 1, имеют ограничение FK для другой таблицы.
И запрос 2, кажется, выполняется правильно без проблем.
Таблица определена следующим образом:
CREATE TABLE [Table1](
[Table1ID] [int] NOT NULL,
[ColX] [int] NOT NULL,
[ColY] [int] NOT NULL,
...
[ColZ] [int] NOT NULL,
...
) ON [PRIMARY]
ALTER TABLE [Table1] ADD CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[Table1ID] ASC,
[ColY] ASC,
[ColZ] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
ALTER TABLE [Table1] WITH CHECK ADD CONSTRAINT [FK_Table1_ColY_Table2_ColY] FOREIGN KEY([ColY])
REFERENCES [Table2] ([ColY])
CREATE TABLE [Table2](
[Table2ID] [int] IDENTITY(1,1) NOT NULL,
[ColY] [int] NOT NULL,
[ColZ] [int] NOT NULL,
...
) ON [PRIMARY]
ALTER TABLE [Table2] ADD CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
[Table2ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
ALTER TABLE [Table2] ADD CONSTRAINT [UK_Table2_ColY] UNIQUE NONCLUSTERED
(
[ColY] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Я ожидаю, что когда я запущу следующее:
DELETE FROM Table2
WHERE ColY = @p2
что я не запускаю FK_Table1_ColY_Table2_ColY.
Тем более, что:
SELECT *
FROM Table1
WHERE ColY = @p2
не возвращает записей.
Полное сообщение об ошибке выглядит следующим образом:
Msg 547, Level 16, State 0
The DELETE statement conflicted with the REFERENCE constraint
"FK_Table1_ColY_Table2_ColY". The conflict occurred in database "localhost", table
"dbo.Table1", column 'ColY'.