SQL参考词的不同行为

时间:2017-06-21 06:41:27

标签: sql sql-server database create-table

我开始在一个新项目中工作,我在C#中编程并使用SQL服务器。 数据库开始变得有点复杂,但没有什么可担心的,但是昨天我在Stack Overflow中找到了一种新的表格关联方式。

表A

CREATE TABLE tableA (
    Id int NOT NULL IDENTITY(1,1),
    name varchar(50),
    CONSTRAINT tablea_pk PRIMARY KEY (Id))

表B

CREATE TABLE tableB (
    Id int NOT NULL IDENTITY(1,1),
    name varchar(50),
    idA int NOT NULL REFERENCES TableA(Id) ON DELETE CASCADE,
    CONSTRAINT tableB_pk PRIMARY KEY (Id))

表C

CREATE TABLE tableC (
    Id int NOT NULL IDENTITY(1,1),
    name varchar(50),
    idB int NOT NULL,
    CONSTRAINT tableC_fk_tableB FOREIGN KEY(idB)
        REFERENCES tableB(Id)
        ON DELETE CASCADE)

我怀疑创建引用的两种方式完全相同,唯一的区别是当您在表B中创建引用时,没有为外键指定约束名称,因此外键的名称是随机生成的,因为我可以在sysobjects表中看到:

SELECT * FROM sysobjects WHERE name LIKE '%FK%'

foreign keys

问题是:两个REFERENCES的工作方式是否完全相同?如果我创建一个约束外键...或者如果我从列的定义行引用PK,它是否相同?

我不知道这是否只能在SQL服务器上完成,或者它是SQL中的常规内容,我也尝试在Google上查找有关它的信息,但我没有运气(也许是因为我不知道是什么我正在寻找)

1 个答案:

答案 0 :(得分:1)

它是相同的,你也可以在表B中内联命名你的约束:

CREATE TABLE tableB (
Id int NOT NULL IDENTITY(1,1),
name varchar(50),
idA int NOT NULL CONSTRAINT FK_TableB_TableA REFERENCES TableA(Id) ON DELETE CASCADE,
CONSTRAINT tableB_pk PRIMARY KEY (Id))
go