SQL PRIMARY KEY 约束

在 SQL 中,PRIMARY KEY 约束用于唯一标识行。它是 NOT NULLUNIQUE 约束的组合,即它不能包含重复值或 NULL 值。

示例

-- create Colleges table with primary key college_id
CREATE TABLE Colleges (
  college_id INT,
  college_code VARCHAR(20) NOT NULL,
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id)
);

这里,college_id 列是 PRIMARY KEY。这意味着该列的值必须是唯一的,并且不能包含 NULL 值。

请注意,以上代码适用于所有主要的数据库系统。但是,某些数据库可能具有不同的语法。


SQL 主键语法

SQL PRIMARY KEY 约束的语法是

CREATE TABLE table_name (
  column1 data_type,
  ...,
  [CONSTRAINT constraint_name] PRIMARY KEY (column1)
);

这里,

  • table_name 是要创建的表的名称
  • column1 是要定义 PRIMARY KEY 约束的列的名称
  • constraint_name 是赋予约束的任意名称
  • [...] 表示其中的代码是可选的。

注意:尽管使用 [CONSTRAINT constraint_name] 命名约束是可选的,但这样做可以更容易地更改和删除约束。


主键错误

在 SQL 中,如果我们尝试在主键列中插入 NULL 或重复值,我们将收到错误。

NOT NULL 约束错误

当我们为主键提供 NULL 值时,我们会收到此错误。这是因为主键需要遵守 NOT NULL 约束。例如,

-- NOT NULL Constraint Error
-- the value of primary key (college_id) is NULL
INSERT INTO Colleges(college_id, college_code, college_name)
VALUES ("ARD12", "Star Public School");

这里,SQL 命令会给我们一个错误,因为我们在 Colleges 表中为主键 college_id 提供了一个 NULL 值。

修复 NOT NULL 约束错误

-- Insertion Success
-- the value of primary key (college_id) is 1
INSERT INTO Colleges(college_id, college_code, college_name)
VALUES (1, "ARD12", "Star Public School");

这里,SQL 命令运行没有错误,因为我们为主键 college_id 提供了值 1


UNIQUE 约束错误

当我们为主键提供重复值时,我们会收到此错误,这违反了其 UNIQUE 约束。例如,

INSERT INTO Colleges(college_id, college_code, college_name)
VALUES (1, "ARD12", "Star Public School");

-- UNIQUE Constraint Error
-- the value of college_id is not unique
INSERT INTO Colleges(college_id, college_code, college_name)
VALUES (1, "ARD12", "Star Public School");

这里,SQL 命令会给我们一个错误,因为我们为主键 college_id 插入了重复值 1

修复 UNIQUE 约束错误

INSERT INTO Colleges(college_id, college_code, college_name)
VALUES (1, "ARD12", "Star Public School");

-- Insertion Success
INSERT INTO Colleges(college_id, college_code, college_name)
VALUES (2, "ARD12", "Star Public School");

这里,SQL 命令运行没有错误,因为我们为 college_id 提供了唯一值 12

注意:一个表只能有一个主键。但是,该单个主键可以包含多个列。


带有多列的主键

主键也可以由多列组成。例如,

-- add the PRIMARY KEY constraint to multiple columns
CREATE TABLE Colleges (
  college_id INT,
  college_code VARCHAR(20),
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id, college_code)
);

这里,名为 CollegePKPRIMARY KEY 约束由 college_idcollege_code 列组成。

这意味着 college_idcollege_code 的组合必须是唯一的,并且这两列不能包含 NULL 值。


使用 ALTER TABLE 的主键约束

我们还可以使用 ALTER TABLE 命令向现有表中的列添加 PRIMARY KEY 约束。例如,

对于单列

ALTER TABLE Colleges
ADD PRIMARY KEY (college_id);

这里,SQL 命令向现有 Colleges 表中的 college_id 列添加 PRIMARY KEY 约束。

对于多列

ALTER TABLE Colleges
ADD CONSTRAINT CollegePK PRIMARY KEY (college_id, college_code);

这里,SQL 命令向现有 Colleges 表中的 college_idcollege_id 列添加 PRIMARY KEY 约束。

注意:此命令不受我们的在线 SQL 编辑器支持,因为它基于 SQLite。


自增主键

每当插入新行时自动增加主键的值是一种常见的做法。例如,

SQL Server

-- use IDENTITY(x, y) to auto increment the value
-- x -> start value, y -> steps to increase
CREATE TABLE Colleges (
  college_id INT IDENTITY(1,1),
  college_code VARCHAR(20) NOT NULL,
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id)
);

-- insert record without college_id
INSERT INTO Colleges(college_code, college_name)
VALUES ("ARD13", "Star Public School");

Oracle

-- create sequence of numbers
CREATE SEQUENCE auto_inc
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10;

CREATE TABLE Colleges (
  college_id INT,
  college_code VARCHAR(20) NOT NULL,
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id)
);

-- create trigger before insert to
-- add auto incremented value
CREATE TRIGGER auto_inc_trigger
BEFORE INSERT ON Colleges
FOR EACH ROW
BEGIN
SELECT auto_inc.nextval INTO :new.college_id FROM dual
END;

-- insert record without college_id
INSERT INTO Colleges(college_code, college_name)
VALUES ("ARD13", "Star Public School");

MySQL

-- AUTO_INCREMENT keyword auto increments the value
CREATE TABLE Colleges (
  college_id INT AUTO_INCREMENT,
  college_code VARCHAR(20) NOT NULL,
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id)
);

-- insert record without college_id
INSERT INTO Colleges(college_code, college_name)
VALUES ("ARD13", "Star Public School");

PostgreSQL

-- SERIAL keyword auto increments the value
CREATE TABLE Colleges (
  college_id INT SERIAL,
  college_code VARCHAR(20) NOT NULL,
  college_name VARCHAR(50),
  CONSTRAINT CollegePK PRIMARY KEY (college_id)
);

-- insert record without college_id
INSERT INTO Colleges(college_code, college_name)
VALUES ("ARD13", "Star Public School");

删除主键约束

我们可以使用 DROP 子句删除表中的 PRIMARY KEY 约束。例如,

SQL Server, Oracle

ALTER TABLE Colleges
DROP CONSTRAINT CollegePK;

MySQL

ALTER TABLE Colleges
DROP PRIMARY KEY;

这里,SQL 命令从 Colleges 表中删除了 PRIMARY KEY 约束。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战