摘要:在本教程中,您将了解 MySQL DEFAULT 约束以及如何有效地使用它。
MySQL DEFAULT 约束简介
MySQL DEFAULT
约束允许您为列指定默认值。以下是DEFAULT
约束的语法:
column_name data_type DEFAULT default_value;
Code language: SQL (Structured Query Language) (sql)
在此语法中,您指定DEFAULT
关键字,后跟该列的默认值。默认值的类型与列的数据类型匹配。
default_value
必须是文字常量,例如数字或字符串。它不能是函数或表达式。但是,MySQL 允许您将当前日期和时间 ( CURRENT_TIMESTAMP
) 设置为TIMESTAMP
和DATETIME
列。
当您定义没有NOT NULL
约束的列时,该列将隐式采用NULL
作为默认值。
如果列具有DEFAULT
约束,并且INSERT
或UPDATE
语句未提供该列的值,则 MySQL 将使用DEFAULT
约束中指定的默认值。
通常,您在创建表时为列设置DEFAULT
约束。 MySQL 还允许您向现有表的列添加默认约束。如果您不想使用列的默认值,可以删除默认约束。
MySQL DEFAULT 约束示例
以下示例创建一个名为cart_items
的新表,其中包含四列item_id
、 name
、 quantity
和sales_tax
:
CREATE TABLE cart_items
(
item_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
quantity INT NOT NULL,
price DEC(5,2) NOT NULL,
sales_tax DEC(5,2) NOT NULL DEFAULT 0.1,
CHECK(quantity > 0),
CHECK(sales_tax >= 0)
);
Code language: SQL (Structured Query Language) (sql)
sales_tax
列的默认值是 0.1 (10%)。以下语句显示cart_items
表:
DESC cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| item_id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| quantity | int | NO | | NULL | |
| price | decimal(5,2) | NO | | NULL | |
| sales_tax | decimal(5,2) | NO | | 0.10 | |
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)
Code language: plaintext (plaintext)
以下INSERT
语句将一个新项目添加到cart_items
表中:
INSERT INTO cart_items(name, quantity, price)
VALUES('Keyboard', 1, 50);
Code language: SQL (Structured Query Language) (sql)
在此示例中, INSERT
语句未提供sales_tax
列的值。 sales_tax
列使用DEFAULT
约束中指定的默认值:
SELECT * FROM cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+---------+----------+----------+-------+-----------+
| item_id | name | quantity | price | sales_tax |
+---------+----------+----------+-------+-----------+
| 1 | Keyboard | 1 | 50.00 | 0.10 |
+---------+----------+----------+-------+-----------+
1 row in set (0.00 sec)
Code language: plaintext (plaintext)
此外,当您将新行插入到cart_items
表中时,您可以显式使用DEFAULT
关键字:
INSERT INTO cart_items(name, quantity, price, sales_tax)
VALUES('Battery',4, 0.25 , DEFAULT);
Code language: SQL (Structured Query Language) (sql)
在本例中, sales_tax
列采用默认值:
SELECT * FROM cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+---------+----------+----------+-------+-----------+
| item_id | name | quantity | price | sales_tax |
+---------+----------+----------+-------+-----------+
| 1 | Keyboard | 1 | 50.00 | 0.10 |
| 2 | Battery | 4 | 0.25 | 0.10 |
+---------+----------+----------+-------+-----------+
2 rows in set (0.01 sec)
Code language: plaintext (plaintext)
向列添加 DEFAULT 约束
要将默认约束添加到现有表的列,请使用ALTER TABLE
语句:
ALTER TABLE table_name
ALTER COLUMN column_name SET DEFAULT default_value;
Code language: SQL (Structured Query Language) (sql)
以下示例将DEFAULT
约束添加到cart_itesm
表的quantity
列:
ALTER TABLE cart_items
ALTER COLUMN quantity SET DEFAULT 1;
Code language: SQL (Structured Query Language) (sql)
如果您描述cart_items
表,您将看到更改:
DESC cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| item_id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| quantity | int | NO | | 1 | |
| price | decimal(5,2) | NO | | NULL | |
| sales_tax | decimal(5,2) | NO | | 0.10 | |
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
Code language: plaintext (plaintext)
以下语句将新行插入到cart_items
表中,而不指定quantity
列的值:
INSERT INTO cart_items(name, price, sales_tax)
VALUES('Maintenance services',25.99, 0)
Code language: SQL (Structured Query Language) (sql)
quantity
列的值默认为 1:
SELECT * FROM cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+---------+----------------------+----------+-------+-----------+
| item_id | name | quantity | price | sales_tax |
+---------+----------------------+----------+-------+-----------+
| 1 | Keyboard | 1 | 50.00 | 0.10 |
| 2 | Battery | 4 | 0.25 | 0.10 |
| 3 | Maintenance services | 1 | 25.99 | 0.00 |
+---------+----------------------+----------+-------+-----------+
3 rows in set (0.00 sec)
Code language: plaintext (plaintext)
从列中删除 DEFAULT 约束
要从列中删除DEFAULT
约束,可以使用ALTER TABLE
语句:
ALTER TABLE table_name
ALTER column_name DROP DEFAULT;
Code language: SQL (Structured Query Language) (sql)
以下示例从cart_items
表的quantity
列中删除DEFAULT
约束:
ALTER TABLE cart_items
ALTER COLUMN quantity DROP DEFAULT;
Code language: SQL (Structured Query Language) (sql)
这是新的cart_items
结构:
DESC cart_items;
Code language: SQL (Structured Query Language) (sql)
输出:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| item_id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| quantity | int | NO | | NULL | |
| price | decimal(5,2) | NO | | NULL | |
| sales_tax | decimal(5,2) | NO | | 0.10 | |
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
Code language: plaintext (plaintext)
概括
- MySQL
DEFAULT
约束设置列的默认值。 - 使用
DEFAULT default_value
为列设置默认约束。 - 使用
ALTER TABLE ... ALTER COLUMN ... SET DEFAULT
将DEFAULT
约束添加到现有表的列。 - 使用
ALTER TABLE ... ALTER COLUMN ... DROP DEFAULT
从现有表的列中删除DEFAULT
约束。