在不知道约束名称的情况下删除外键?

时间:2009-05-05 12:09:51

标签: sql-server

我使用以下命令创建了一个表:

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>

有什么办法吗?请帮助。

7 个答案:

答案 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;

您将看到如何创建表...列,类型等。你可以看到你的约束名。