怎么用SQL语句给数据库表设置主键,有啥注意的地方和写法
- 问答
- 2026-01-02 18:47:43
- 3
要给数据库表设置主键,最直接的方法是在创建表的时候就直接定义好,这是最常用也是最推荐的做法,你想创建一个叫“学生信息”的表,里面包括学号、姓名、年龄等字段,你希望“学号”是唯一标识每个学生的,也就是主键,那么SQL语句可以这样写(来源:标准SQL语法):
CREATE TABLE 学生信息 (
学号 INT NOT NULL,
姓名 VARCHAR(50),
年龄 INT,
PRIMARY KEY (学号)
);
这里的关键部分就是 PRIMARY KEY (学号),这句话明确地告诉数据库,“学号”这个字段是这张表的主键,同时你注意到,在定义“学号”字段时,我加上了 NOT NULL,这是因为主键有一个非常重要的规矩:主键的值绝对不能是空的(NULL),这是设置主键时第一个要注意的地方,数据库会强制保证这一点,如果你尝试插入一条没有学号的学生记录,操作会失败。
可能单靠一个字段无法唯一确定一条记录,在一个“选课记录”表里,一个学生可以选择多门课,一门课也可以被多个学生选择,单用“学号”或单用“课程号”都无法唯一确定一条选课记录,这时候,就需要用两个(甚至更多)字段一起来做主键,这叫做“联合主键”或“复合主键”,写法是这样的(来源:标准SQL语法):
CREATE TABLE 选课记录 (
学号 INT NOT NULL,
课程号 INT NOT NULL,
成绩 DECIMAL(3,1),
选课时间 DATE,
PRIMARY KEY (学号, 课程号)
);
你看,PRIMARY KEY 括号里现在有两个字段,用逗号隔开,这意味着数据库会确保每个“学号+课程号”的组合在整个表里都是独一无二的,学号为1001的学生选择了课程号2001的课,这样的记录只能有一条,如果他再次选同一门课,数据库是不允许插入重复记录的,同样,这两个字段也都必须是非空的。

如果表已经创建好了,但忘记设置主键了怎么办?或者一开始没想清楚,后来需要加上去?这时候就需要用到修改表的语句。这里有一个非常重要的前提:你要设为主键的那个字段(或几个字段),它里面的现有数据必须已经满足主键的条件——也就是没有空值,并且没有重复值,如果现有数据里学号有重复的,或者有空的,你就没法直接加主键,必须先清理数据。
假设我们的“学生信息”表已经存在,但没主键,现在要给“学号”字段补上主键,可以这样写(来源:标准SQL语法):
ALTER TABLE 学生信息 ADD PRIMARY KEY (学号);
如果是给已存在的表添加联合主键,写法类似:

ALTER TABLE 选课记录 ADD PRIMARY KEY (学号, 课程号);
在执行这些 ALTER TABLE 操作之前,如果心里没底,最好先检查一下数据,可以用查询语句看看有没有重复或空值,检查“学生信息”表中学号是否有重复:
SELECT 学号, COUNT(*) FROM 学生信息 GROUP BY 学号 HAVING COUNT(*) > 1;
如果这条查询语句返回了任何结果,就说明有重复的学号,你需要先处理这些重复数据(比如删除重复项或修改学号),才能成功添加主键。
另一个需要注意的地方是主键的名称,在我们上面的例子中,我们没有给主键约束本身起名字,数据库系统(如MySQL, PostgreSQL, SQL Server等)会自动为我们生成一个名字,但有时候,特别是在后续需要管理或删除这个主键约束时,有一个明确的名字会更方便,我们可以在创建时自己给它起个名字,这在不同的数据库里语法略有差异,但标准或常见的写法是这样的(来源:常见数据库系统如MySQL/PostgreSQL的支持):

创建表时指定主键名:
CREATE TABLE 学生信息 (
学号 INT NOT NULL,
姓名 VARCHAR(50),
CONSTRAINT PK_学生信息_学号 PRIMARY KEY (学号) -- 这里给主键起了个名字叫"PK_学生信息_学号"
);
修改表时指定主键名:
ALTER TABLE 学生信息 ADD CONSTRAINT PK_学生信息_学号 PRIMARY KEY (学号);
这里的 CONSTRAINT PK_学生信息_学号 就是给这个主键约束起了一个标识符,名字可以自己定,一般会包含表名和字段名,方便识别。
简单总结一下核心注意点:
- 唯一性:主键的值必须在整个表中是唯一的。
- 非空性:主键的字段不能接受空值(NULL)。
- 谨慎选择:主键一旦设定,最好不要修改,所以要选择一个稳定、不会变化的字段或字段组合,比如学生的学号通常比姓名更适合做主键,因为姓名可能重复也可能更改。
- 数据准备:对于已存在的表,添加主键前务必确保数据满足唯一和非空条件。
- 联合主键:当单个字段无法保证唯一性时,考虑使用多个字段组合作为主键。
- 命名习惯:虽然不是强制,但给主键约束起一个有意义的名字是良好的习惯,便于后续维护。
不同的数据库管理系统(比如MySQL、SQL Server、Oracle等)在细节上可能有一点点语法差异(比如自增主键的写法差别很大),但上面介绍的核心概念和基本写法是通用的,在实际操作时,如果遇到问题,最好查阅你所用的特定数据库的官方文档。
本文由度秀梅于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/73242.html
