我创建了一个外键而没有指定名称,因此sql server使用自动生成的名称创建了它。现在我想删除具有此外键的列。问题是我不知道这个外键的名称。有没有办法删除特定表中特定列的所有外键?
到目前为止,我发现这个脚本会删除列
的所有默认约束DECLARE @tableName VARCHAR(MAX)
DECLARE @ConstraintName nvarchar(200)
DECLARE @columnName VARCHAR(MAX)
SET @tableName = 'tablename'
SET @columnName = 'columnname'
SELECT @ConstraintName = Name
FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID(@tableName)
AND PARENT_COLUMN_ID = (
SELECT column_id FROM sys.columns
WHERE NAME = @columnName AND object_id = OBJECT_ID(@tableName))
IF @ConstraintName IS NOT NULL
BEGIN
EXEC('ALTER TABLE '+@tableName+' DROP CONSTRAINT ' + @ConstraintName)
END
ALTER TABLE [tablename] DROP COLUMN columnname
GO
但它对外键约束没有帮助。
答案 0 :(得分:4)
如果您想获得有关FK的更多信息,特别是有关特定方案和表格的信息,请参阅。
SELECT
t.Name as TableName,
c.name as ColumnName,
fk.name as FK_NAME
FROM sys.foreign_keys as fk
inner join sys.tables as t on fk.parent_object_id = t.object_id
inner join sys.columns as c on c.object_id = t.object_id
inner join sys.schemas as sc on t.schema_id = sc.schema_id
WHERE sc.name = 'Schema' and t.name = 'Table' and c.name = 'Column'
如果您只对某个专栏感兴趣,那么您可以使用 Ross Presser 回答。
此外,如果您想删除所有fk约束,您可以执行此操作:
Declare @sql nvarchar(4000)
SET @sql = N'';
SELECT @sql = @sql + '
ALTER TABLE [' + sc.NAME + '].[' + OBJECT_NAME(fk.parent_object_id) + ']' + ' DROP CONSTRAINT ' + '[' + fk.NAME + ']
'
FROM sys.foreign_keys as fk
inner join sys.tables as t on fk.parent_object_id = t.object_id
inner join sys.columns as c on c.object_id = t.object_id
inner join sys.schemas as sc on t.schema_id = sc.schema_id
WHERE sc.name = 'schemaName' and c.name = 'columnName' -- you can include and fk name
ORDER BY fk.NAME
PRINT @sql;
--EXEC sys.sp_executesql @sql;
答案 1 :(得分:2)
您可以借助以下查询获取所有约束列表以及分配给特定表的名称:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME='YourTableName';
找到要删除的约束后,您可以借助以下查询来执行此操作:
ALTER TABLE Orders
DROP CONSTRAINT constraint_name;
答案 2 :(得分:1)
您可以在整个数据库中找到使用该列的所有约束:
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
WHERE CCU.COLUMN_NAME='someColumn'
输出提供约束名称及其附加的表。