"外键"和"约束外键"之间的区别

lap*_*ots 20 sql

我的意思是例如我可以创建表格

create table XTable
( 
  idt int not null primary key,
  value nvarchar(50),
  idq int,
  constraint fk_idq foreign key(idq) references YTable(idq)
)
Run Code Online (Sandbox Code Playgroud)

我可以像这样创造它

create table XTable
(
  idt int not null primary key,
  value nvarchar(50),
  idq int,
  foreign key(idq) references YTable(idq)
)
Run Code Online (Sandbox Code Playgroud)

我通常在第二个例子中创建表格,但现在我对第一个例子感到好奇.有什么不同?

Luk*_*der 15

第一个为外键分配用户定义的名称,第二个将为外键分配系统生成的名称.

用户定义的外键名称可用于后续语句,如下所示:

ALTER TABLE XTable DROP    CONSTRAINT fk_idq;
ALTER TABLE XTable ENABLE  CONSTRAINT fk_idq;
ALTER TABLE XTable DISABLE CONSTRAINT fk_idq;
Run Code Online (Sandbox Code Playgroud)

使用系统生成的名称更改约束更加困难,因为您必须首先发现这些名称.

  • @StefanFalk:我看到了每个表都有4个字母的正式缩写的系统,例如:** ACCO ** UNTS-> ACCO,** AC ** COUNT_ ** TR ** ANSACTIONS-> ACTR,* * AC ** OUNT_ ** T ** RANSACTION_ ** D ** ETAILS-> ACTD。这些缩写可以用于所有派生名称,例如约束,索引,视图,别名(在联接中)等。 (2认同)

Adr*_*der 15

第一个选项纯粹是为了命名约束.

SQL FOREIGN KEY约束

要允许命名FOREIGN KEY约束,并在多列上定义FOREIGN KEY约束,请使用以下SQL语法

CREATE TABLE Orders
 (
 O_Id int NOT NULL,
 OrderNo int NOT NULL,
 P_Id int,
 PRIMARY KEY (O_Id),
 CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
 REFERENCES Persons(P_Id)
 )
Run Code Online (Sandbox Code Playgroud)

此外,从CREATE TABLE(Transact-SQL)可以看出这[ CONSTRAINT constraint_name ]是可选的.

  • Noob问题:命名约束有什么好处? (3认同)
  • @BradTurek 命名约束可确保我们不依赖于数据库引入的命名,这可能会在版本之间发生变化。当您定期进行数据库版本升级和/或您拥有更大的团队时,这可以提供更好的一致性。 (2认同)

Ric*_*iwi 5

除了控制名字之外,什么都没有。如果省略,SQL Server 将提供一个名称。仅供参考,你只需要这个语法(SQL Fiddle)

create table XTable
(
  idt int not null primary key,
  value nvarchar(50),
  idq int references YTable(idq)
)
Run Code Online (Sandbox Code Playgroud)

这是一个更完整的例子