Gal*_*you 3 t-sql sql-server sql-server-2005
我在一个模式(比如dbo)中有一组表(比如Account,Customer),我在另一个模式中有一些其他表(比如Order,OrderItem)(比如库存).Order表和Customer表之间存在关系.我想删除第一个模式(dbo)中的表与第二个模式(库存)中的表之间的所有关系,而不删除同一模式中的表之间的关系.
那可能吗?任何帮助赞赏.
使用元数据:
SELECT *
FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
WHERE CONSTRAINT_NAME IN ( SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' )
SELECT *
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
WHERE CONSTRAINT_NAME IN ( SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' )
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
Run Code Online (Sandbox Code Playgroud)
添加过滤条件以查找要DROP的约束,然后将它们插入模板中:
ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME}
Run Code Online (Sandbox Code Playgroud)
并使用动态SQL执行.
请通过将以下脚本复制并粘贴到 SQL Studio 来使用它:
SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP [' + CONSTRAINT_NAME + ']'
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
Run Code Online (Sandbox Code Playgroud)
您可以通过以下脚本获取数据库中存在的可用FK,然后将其删除:
select * from sys.objects o
join sys.schemas s on o.schema_id = s.schema_id
where o.type = 'F'
Run Code Online (Sandbox Code Playgroud)
之后删除如下
ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME}
Run Code Online (Sandbox Code Playgroud)