我想知道是否可以在标准SQL中创建多个主键。我的意思是这样的:
CREATE TABLE(Surname CHAR(100) PRIMARY KEY, Name CHAR(100) PRIMARY KEY)
这在 SQL 中合法吗?如果不是,请链接我对标准的引用,该标准说这是不可能的......
我想知道是否可以在标准SQL中创建多个主键。我的意思是这样的:
CREATE TABLE(Surname CHAR(100) PRIMARY KEY, Name CHAR(100) PRIMARY KEY)
这在 SQL 中合法吗?如果不是,请链接我对标准的引用,该标准说这是不可能的......
澄清问题后进行编辑。
主键的定义是只有一个。因此,不,您不能在两个不同的列上创建两个主键。
但是,您可以在一列上创建主键,在另一列上创建唯一约束:
create table person
(
surname varchar(100) not null primary key,
name varchar(100) not null,
constraint only_one_name unique (name)
);
以上是我所知道的标准 SQL。
这是“SQL-99,完整”一书的链接,它以更实用的方式重新陈述了 SQL 标准:https ://mariadb.com/kb/en/constraint_type-primary-key-constraint/
书中引用:
一个基表可以被不超过一个 PRIMARY KEY 约束
SQL标准的原始措辞(不是免费的,所以没有人可以给你一个链接):
A
<table definition>
应指定至多一个隐式或显式<unique constraint definition>
指定PRIMARY KEY
.
(强调我的)
请注意,您几乎不需要char
- 尤其是长度不超过两个或三个字符。数据类型将CHAR
所有值填充到定义的长度。因此,如果您将值'FOO'
插入到CHAR(10)
列中,它将(必须)存储为'FOO '
不,在 SQL 中创建两个主键是不合法的,如果您能够创建两个单独的主键,那么它就不再是主键了。
您可以创建一个复合主键,例如主键(姓氏,姓名),但这将永远不适用,不好的做法是姓名和姓氏的主键。
否 - 但您可以拥有一个由多个列组合而成的主键:
来自MSDN:
表通常具有一列或列组合,其中包含唯一标识表中每一行的值。这一列或多列称为表的主键 (PK),并强制执行表的实体完整性。您可以通过在创建或修改表时定义 PRIMARY KEY 约束来创建主键。
一张表只能有一个 PRIMARY KEY 约束,参与 PRIMARY KEY 约束的列不能接受空值。因为 PRIMARY KEY 约束保证数据的唯一性,所以它们经常在标识列上定义。
这有点迂腐,但你当然不能创建多个主键,就像房间里最高的人不能超过一个一样。但是您可以(并且很多时候应该)创建多个唯一键。并且,除了一个细微的区别外,它们之间没有功能上的区别。唯一键可以用作 FK 约束的目标,也可以像主键一样用于连接。
你只能有一个主键,但这个主键可以由 N 列组成。
例子:
create table "TABLE NAME"(
"Surname" CHAR(100),
"Name" CHAR(100),
primary key ("Surname", "Name")
);
您可以有一个包含多个列的主键。这通常在属性表中完成,其中键的一部分包含您要归因的表中记录的 id。
您不能拥有多个主键,因为它被列为“最重要的”。不可能有两件事“最重要”。