我之前编写了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,那么查询会不同吗?
答案 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中应该怎么做...对不起......