我使用以下命令创建了一个表:
create table Table1(
Id int Not Null
Foreign key
references Table2(Id)
on delete cascade
on update cascade,
UserName nvarchar(150),
TimeInSeconds int Not Null
primary key(Id,TimeInSeconds)
);
但是现在我想删除外键。 由于我没有给出约束名称,我无法使用:
Alter table <tablename>
drop foreign key <foreign key name>
有什么办法吗?请帮助。
答案 0 :(得分:24)
与Ed的答案类似,但您可以使用此选项根据表格和列名称选择密钥名称。
通过这种方式,您可以在脚本中运行它,也可以作为子查询来删除约束。
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_NAME = 'post'
AND COLUMN_NAME = 'userID'
答案 1 :(得分:22)
您可以在INFORMATION_SCHEMA.TABLE_CONSTRAINTS
select CONSTRAINT_NAME
from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
where TABLE_NAME = 'Table1'
答案 2 :(得分:9)
因为我遇到了一些陷阱而扩大了答案。另外,我声明了2个外键,所以我添加了一个可选的键来保存,如果它是null,它将被忽略:
// StudentController.js
module.exports = {
findOne: function(req, res) {
Student.findOne(req.param('id')).populate('enrollments').then(function(student){
var studentClasses = Class.find({
id: _.pluck(student.enrollments, 'class')
}).then(function (classes) {
return classes
})
return [student, classes]
}).spread(function(student, classes){
var classes = _.indexBy(classes, 'id')
student.enrollments = _.map(student.enrollments, function(enrollment){
enrollment.class = classes[enrollment.class]
return enrollment
})
res.json(200, student)
}).catch(function(err){
if (err) return res.serverError(err)
})
}
}
// Student.js
module.exports = {
attributes: {
enrollments: {
collection: 'enrollment',
via: 'student'
}
// Rest of the attributes..
}
}
// Enrollment.js
module.exports = {
attributes: {
student: {
model: 'student'
}
class: {
model: 'class'
}
// Rest of the attributes...
}
}
// Class.js
module.exports: {
attributes: {
enrollments: {
collection: 'enrollment',
via: 'class'
}
// Rest of the attrubutes
}
}
答案 3 :(得分:1)
SQL Server选项:
DECLARE @foreignkey varchar(100)
DECLARE @tablename varchar(100)
DECLARE @command nvarchar(1000)
DECLARE db_cursor CURSOR FOR
SELECT fk.name, t.name
FROM sys.foreign_keys fk
JOIN sys.tables t ON t.object_id = fk.parent_object_id
WHERE t.name IN (
'table_1_name_here',
'table_2_name_here'
)
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @command = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @foreignkey
EXECUTE(@command)
FETCH NEXT FROM db_cursor INTO @foreignkey, @tablename
END
CLOSE db_cursor
DEALLOCATE db_cursor
SQL选择您关心的表的所有约束到游标中并逐个删除它们。您需要知道的只是您希望从中删除的表的名称。
答案 4 :(得分:0)
如果您只是查看企业管理器/管理工作室中的表,您将能够看到密钥列表并从那里删除它。
答案 5 :(得分:0)
没关系,下面是Postgres语法。如果问题的标题中包含sql server,那会更好,因为我没有注意到标签
您还可以使用cascade
在父表上拖放并重新添加主键。这将删除所有引用该表的外键,而无需知道外键名称。
ALTER TABLE parent_table
DROP CONSTRAINT 'pk_id' CASCADE
-- add back pk
ALTER TABLE parent_table
ADD CONSTRAINT 'pk_id' PRIMARY KEY (id)
警告:您要首先检查所有依赖项,如果还有其他表,则需要重新添加它们的外键。这样可以在重新添加外键时正确命名外键。由于交易阻塞,这种方法在高交易系统中可能也不可行。
答案 6 :(得分:-2)
你可以把:
<强>&GT; show create table tablename;
您将看到如何创建表...列,类型等。你可以看到你的约束名。