有时候我们真的不想手动填所有字段——要么懒,要么就是没数据。这种时候可以提前设好默认值,让数据库自己帮你填上。
往表里插入行
默认值和往表里插入行关系很大。所以我先简单说下,后面还会再详细讲。
往表里加行其实超简单——有专门的命令 INSERT INTO。INSERT INTO 是个SQL操作符,用来 往表里加新行。这个用得特别多,尤其是搞web表单、日志、用户注册、数据更新的时候。
命令语法
INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);
解释一下:
表名—— 你要加数据的表的名字。列1,列2, ... —— 要插入的列名(如果你所有列都按顺序给值,可以省略)。值1,值2, ... —— 跟上面列名一一对应的值。
简单例子
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
这会往 users 表里加一行:name是 "Alice",email是 "alice@example.com"。
结果:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
一次插入多行
你也可以 一次插入多条记录,这样更快更省事。
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
结果会是这样:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
默认值
还记得插入行的语法吗?
INSERT INTO 表名 (列1, 列2, ...)
VALUES (值1, 值2, ...);
你觉得为啥要写列名:列1, 列2?其实你也可以直接按表的列顺序给值。
其实很多 值都可以不写。比如新行的ID,PostgreSQL会自己算。还有插入时间啥的,也能自动填。如果你没传某些数据,PostgreSQL会给它们填NULL。
PostgreSQL能帮你自动搞定很多事。你还可以自己控制——这就是 默认值 的用处,用 DEFAULT 关键字来设。
默认值就是:你插入数据时没给某个字段赋值,它就用默认的。这样省事还防止漏填重要数据。
DEFAULT 怎么用?
来看看语法。默认值是在建表时设的。一般格式:
CREATE TABLE 表名 (
列名 数据类型 DEFAULT 默认值
);
或者你想给已有表加默认值:
ALTER TABLE 表名
ALTER COLUMN 列名
SET DEFAULT 默认值;
怎么改表结构,后面几节我会详细讲 :P
例子1:有 DEFAULT 字段的表
建个 students 表,每个学生自动获得注册日期:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
现在你加新学生时不写 registration_date,PostgreSQL会自动填今天的日期。
INSERT INTO students (name) VALUES ('Alex Lin');
查一下:
SELECT * FROM students;
你会看到:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
实用例子
数字列的默认值
比如有个 grades 表,grade 字段没打分时默认是 0。
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
加一条没写 grade 的记录:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
表现在是这样:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
用 TEXT 类型的默认值
想象有个 teachers 表,每个老师加进去时自动给个“未认证”状态。
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'unverified'
);
加个老师,不写status:
INSERT INTO teachers (name) VALUES ('Peter Pall');
结果:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | unverified |
时间的默认值
比如 meetings 表,存会议数据,meeting_time 字段默认是上午10点。
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
加一条记录:
INSERT INTO meetings (topic) VALUES ('项目讨论');
结果:
| id | topic | meeting_time |
|---|---|---|
| 1 | 项目讨论 | 10:00 |
用 DEFAULT 时常见的坑
默认值类型和字段类型不匹配。 比如你给数字列设了个文本默认值,PostgreSQL会报错:
CREATE TABLE example (
number INTEGER DEFAULT 'text'
);
报错:
invalid input syntax for type integer.
改 DEFAULT 时没考虑已有数据。 你改了默认值,已经存在的记录不会变——它们还是老样子。如果想更新老数据,用 UPDATE。
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
把 DEFAULT 和 NOT NULL 搞混。 默认值不等于字段必填(NOT NULL)。你不写 NOT NULL,这个字段还是能存 NULL。
GO TO FULL VERSION