CodeGym /课程 /SQL SELF /使用 DEFAULT 作为默认值

使用 DEFAULT 作为默认值

SQL SELF
第 17 级, 课程 2
可用

有时候我们真的不想手动填所有字段——要么懒,要么就是没数据。这种时候可以提前设好默认值,让数据库自己帮你填上。

往表里插入行

默认值和往表里插入行关系很大。所以我先简单说下,后面还会再详细讲。

往表里加行其实超简单——有专门的命令 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 email
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 email
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。

2
任务
SQL SELF, 第 17 级, 课程 2
已锁定
使用 `DEFAULT` 为数值设置默认值创建表
使用 `DEFAULT` 为数值设置默认值创建表
2
任务
SQL SELF, 第 17 级, 课程 2
已锁定
使用多个带有 `DEFAULT` 值的列
使用多个带有 `DEFAULT` 值的列
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION