在 SQL 中,PRIMARY KEY
约束用于唯一标识行。它是 NOT NULL
和 UNIQUE
约束的组合,即它不能包含重复值或 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 提供了唯一值 1 和 2。
注意:一个表只能有一个主键。但是,该单个主键可以包含多个列。
带有多列的主键
主键也可以由多列组成。例如,
-- 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)
);
这里,名为 CollegePK 的 PRIMARY KEY
约束由 college_id 和 college_code 列组成。
这意味着 college_id 和 college_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_id 和 college_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
约束。
另请阅读