如何更改现有外键以添加约束名称

时间:2018-05-13 13:38:04

标签: mysql sql sql-server

我之前编写了create查询,如下所示,外键未命名。

CREATE TABLE My_Table_Name (
    USER_ID VARCHAR(255) NOT NULL,
    CONSENT_ID VARCHAR(255)  NOT NULL,
    PRIMARY KEY (USER_ID, CONSENT_ID),
    FOREIGN KEY (CONSENT_ID) REFERENCES ANOTHER_TABLE_NAME (CONSENT_ID) ON DELETE CASCADE
);

现在表中有数据,我想将约束名称添加到现有的外键中。我怎样才能做到这一点?

PS:我需要的是ALTER查询

另外,如果数据库是SQL Server而不是MySQL,那么查询会不同吗?

3 个答案:

答案 0 :(得分:3)

创建后,无法重命名MySQL中的外键约束。您将不得不删除约束,然后使用您想要的名称重新创建它。

首先,您将不得不去挖掘外键约束名称(有一个,你只是不知道它是什么):

SELECT constraint_name
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE constraint_schema = 'your_db_name' AND table_name = 'My_Table_Name';

现在重命名约束:

ALTER TABLE My_Table_Name
DROP FOREIGN KEY some_foreign_key    -- from above query
ADD CONSTRAINT fk_my_constraint FOREIGN KEY (CONSENT_ID)
    REFERENCES ANOTHER_TABLE_NAME (CONSENT_ID) ON DELETE CASCADE;

答案 1 :(得分:2)

您使用constraint关键字:

CREATE TABLE My_Table_Name (
  USER_ID VARCHAR(255) NOT NULL,
  CONSENT_ID VARCHAR(255)  NOT NULL,
  CONSTRAINT pk_mY_table_name PRIMARY KEY (USER_ID, CONSENT_ID),
  CONSTRAINT fk_my_table_name_consent_id FOREIGN KEY (CONSENT_ID) REFERENCES ANOTHER_TABLE_NAME (CONSENT_ID) ON DELETE CASCADE
);

这是标准语法,几乎在任何数据库中都是相同的。

在两个数据库中,您都需要浏览元数据表以获取现有约束的名称。然后添加一个新的:

alter table my_table_name
    drop constraint x,
    drop constraint y;

alter table my_table_name
    CONSTRAINT pk_mY_table_name PRIMARY KEY (USER_ID, CONSENT_ID),
    CONSTRAINT fk_my_table_name_consent_id FOREIGN KEY (CONSENT_ID) REFERENCES ANOTHER_TABLE_NAME (CONSENT_ID) ON DELETE CASCADE;

您可以从INFORMATION_SCHEMA.TABLE_CONSTRAINTS获取约束名称(请参阅here)。这在两个数据库中都可用。我注意到INFORMATION_SCHEMA表中的列有时会有所不同。

答案 2 :(得分:1)

在MS SQL中,匿名约束将获得系统生成的名称。

您可以使用以下查询来获取生成的约束名称:

SELECT
    FK.CONSTRAINT_NAME
FROM
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON
        PK.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG AND
        PK.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA AND
        PK.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
    INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON
        FK.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG AND
        FK.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA AND
        FK.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE
    FK.TABLE_NAME = N'My_Table_Name' AND
    PK.TABLE_NAME = N'ANOTHER_TABLE_NAME'

这会产生类似于' FK__My_Table ___ CONSE__5535A963'的结果。

接下来,您可以使用sp_rename存储过程,如下所示:

EXECUTE sp_rename N'FK__My_Table___CONSE__5535A963', N'FK_MyRenamedConstraint';

当然,您需要在查询中使用正确的约束名称。

(您可以忽略SQL Server的默认警告,即重命名可能会破坏现有脚本和存储过程。)

再次执行第一个查询时,它会显示新名称。

我不知道在MySQL中应该怎么做...对不起......