关于在创建新表时使用CONSTRAINT
关键字的问题。我在下面看到了一些这样的代码:
CREATE TABLE dbo.T1
(
keycol INT NOT NULL IDENTITY(1, 1)
CONSTRAINT PK_T1 PRIMARY KEY,
datacol NVARCHAR(40) NOT NULL
);
我的问题是,NOT NULL
是否也和CONSTRAINT
一样PRIMARY KEY
,所以为什么要为CONSTRAINT
放置PRIMARY KEY
关键字,但是不适合NOT NULL
吗?
答案 0 :(得分:2)
CONSTRAINT是一个可选关键字,指示开始 PRIMARY KEY,NOT NULL,UNIQUE,FOREIGN KEY或CHECK的定义 约束。
因此,您可以根据需要在其中使用CONSTRAINT
关键字
CREATE TABLE dbo.T1
(
keycol INT NOT NULL IDENTITY(1, 1)
CONSTRAINT PK_T1 PRIMARY KEY,
datacol NVARCHAR(40) CONSTRAINT Foo NOT NULL
);
这是没有意义的,因为只有在指定名称时约束才需要使用约束关键字。并且,当与NOT NULL
一起使用时,实际上并没有在sys.constraints
中创建约束对象,因此该名称不会存储在任何地方。它是否可为空只是该列的一个属性。
答案 1 :(得分:1)
可以使用ALTER TABLE ALTER COLUMN
语句修改NOT NULL约束。因此,NOT NULL约束的显式名称是没有用的。 NOT NULL约束的名称将不会存储在数据库的元数据中。
可以使用ALTER TABLE DROP CONSTRAINT
语句删除其他约束(主键,外键,唯一,检查和默认)。对于此类语句,必须指定约束名称。因此从技术上讲,此类约束始终需要一个约束名称。
但是约束名称在SQL语法中始终是可选的,因此在创建约束时始终可以省略CONSTRAINT [constraintname]
。所以这也是有效的SQL:
CREATE TABLE dbo.T1
(
keycol INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
datacol NVARCHAR(40) NOT NULL
);
但是,对于实际上需要删除约束名称的约束,如果未明确提供约束名称,则DBMS将自动生成约束名称。在上面的CREATE TABLE
语句中,主键将获得一个类似PK__T1__98D78B44D915DA1F
的名称。
明确命名主键,外键,唯一约束,检查约束和默认约束将简化数据库表的将来维护。如果您明确命名约束,您将始终清楚地知道约束的方式被命名。如果要删除“无名”约束,则必须首先在数据库的元数据中查找其生成的名称(我认为这非常丑陋和复杂)。