在SQL Server中,使用或不使用CONSTRAINT关键字的区别

8

在SQL Server中使用或不使用CONSTRAINT关键字处理外键有什么区别?

我注意到在这种特定情况下,似乎两者都可以不使用CONSTRAINT关键字来工作:

CREATE TABLE ClientsPhones
(
     ClientPhone varchar(10) NOT NULL,
     ClientID smallint NOT NULL,

     PRIMARY KEY (ClientPhone),
     FOREIGN KEY (ClientID) REFERENCES Clients(ClientID)
);

使用CONSTRAINT关键字:

CREATE TABLE ClientsPhones
(
    ClientPhone varchar(10) NOT NULL,
    ClientID smallint NOT NULL,

    PRIMARY KEY (ClientPhone),
    CONSTRAINT fk_ClientID 
      FOREIGN KEY (ClientID) REFERENCES Clients(ClientID)
);

除非Clients表中已存在ClientID,且ClientsPhones表中不存在相同的ClientIDClientPhone,否则两者都不允许我向表中添加记录。

除了我能够命名约束这一事实之外,它们之间是否有任何真正的区别?


11
如果您使用 CONSTRAINT fk_ClientID,则您可以为约束命名 - 您可以选择适合您的命名规则。否则,如果省略该子句,则 SQL Server 将为您选择约束的名称 - 这个名称不容易理解,也不是显而易见的。始终自己为约束命名!另外也要为主键约束命名! - marc_s
使用 constraint 可以为外键约束指定特定名称。如果选择得当,这可以使错误消息更易于理解。 - Gordon Linoff
2个回答

8
如果您不创建约束条件,它会自动创建自己的约束条件名称。
外键索引名称是根据引用外键列的名称自动生成的。
因此,无法区分使用和不使用约束关键字。默认情况下,将定义约束名称。

1
我做了一些研究,不认为Hell Boy的回答很清晰,并且存在一些错误信息。
数据库中添加的每个约束都有一个默认名称。这包括PRIMARY KEYFOREIGN KEYDEFAULTNOT NULL。它不一定是所使用的列的名称。
你可以想象当你没有使用CONSTRAINT关键字时,SQL Server也会将其放在那里并为你生成一个名称。
如果你想要删除或更改某个约束,你要么必须删除整个表并重新创建具有正确约束的表,要么可以通过名称引用约束,然后像修改列一样使用ALTER关键字进行更改。当你需要删除具有外键的表时,这可能非常有用。如果你命名了外键约束,你可以删除它,然后再删除该约束指向的表,而不是删除该表。

所以基本上你的意思是,你不能更改由SQL Server默认创建的约束,但你可以更改直接创建并应用名称的约束? - spencer741

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接