MySQL必知必会03:创建和修改数据表

阅读整理自《MySQL 必知必会》- 朱晓峰,详细内容请登录 极客时间 官网购买专栏。

创建数据表

MySQL 创建表的语法结构:

create table <表名>
(
字段名1 数据类型 [字段级别约束] [默认值],
字段名2 数据类型 [字段级别约束] [默认值]......
[表级别约束]
);

“约束”限定了表中数据应该满足的条件。MySQL 会根据这些限定条件,对表的操作进行监控,阻止破坏约束条件的操作执行,并提示错误,从而确保表中数据的唯一性、合法性和完整性。这是创建表时不可缺少的一部分。

案例,需要创建满足下面这个需求的数据库:

在这里插入图片描述

create table demo.importhead
(
listnumber INT,
supplierid INT,
stocknumber INT,
-- 在字段importype定义为INT类型的后面,按照MySQL创建表的语法,加了默认值1
importtype INT DEFAULT 1,
quantity DECIMAL(10,3),
importvalue DECIMAL(10,2),
recorder INT,
recordingdate DATETIME
);

在创建表的时候,字段名称要避开 MySQL 的系统关键字,原因是 MySQL 系统保留的关键字都有特定的含义,如果作为字段名称出现在 SQL 语句中,MySQL 会把这个字段名称理解为系统关键字,从而导致 SQL 语句无法正常运行。比如,刚刚我们把进货金额设置为“importvalue”,而不是“value”,就是因为,“value”是 MySQL 的系统关键字。

INSERT INTO demo.importhead
(
-- 这里没有插入字段importtype的值,有默认值
listnumber, supplierid, stocknumber, quantity, importvalue, recorder, recordingdate
)
VALUES
(
3456, 1, 1, 10, 100, 1, '2020-12-10'
);
INSERT INTO demo.importhead
(
-- 插入字段importtype的值
listnumber, supplierid, stocknumber, importtype, quantity, importvalue, recorder, recordingdate
)
VALUES
(
2345, 1, 1, 2, 10, 100, 1, '2020-12-21'
);
mysql> select * from demo.importhead;
+------------+------------+-------------+------------+----------+-------------+----------+---------------------+
| listnumber | supplierid | stocknumber | importtype | quantity | importvalue | recorder | recordingdate       |
+------------+------------+-------------+------------+----------+-------------+----------+---------------------+
|       3456 |          1 |           1 |          1 |   10.000 |      100.00 |        1 | 2020-12-10 00:00:00 |
|       2345 |          1 |           1 |          2 |   10.000 |      100.00 |        1 | 2020-12-21 00:00:00 |
|       1234 |          1 |           1 |          3 |    5.000 |       50.00 |        1 | 2020-12-30 00:00:00 |
+------------+------------+-------------+------------+----------+-------------+----------+---------------------+
3 rows in set (0.00 sec)

约束

给字段设置默认值的做法,就是默认约束。设置了默认约束,插入数据的时候,如果不明确给字段赋值,那么系统会把设置的默认值自动赋值给字段。除了默认约束,还有主键约束、外键约束、非空约束、唯一性约束和自增约束。

非空约束

非空约束表示字段值不能为空,如果创建表的时候,指明某个字段非空,那么添加数据的时候,这个字段必须有值,否则系统就会提示错误。

唯一性约束

唯一性约束表示这个字段的值不能重复,否则系统会提示错误。跟主键约束相比,唯一性约束要更加弱一些。

在一个表中,可以指定多个字段满足唯一性约束,而主键约束则只能有一个,这也是 MySQL 系统决定的。另外,满足主键约束的字段,自动满足非空约束,但是满足唯一性约束的字段,则可以是空值。

自增约束

自增约束可以让 MySQL 自动给字段赋值,且保证不会重复,非常有用,只是不容易用好。

在数据表中,只有整数类型的字段(包括 TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT),才可以定义自增约束。自增约束的字段,每增加一条数据,值自动增加 1。

可以给自增约束的字段赋值,这个时候,MySQL 会重置自增约束字段的自增基数,下次添加数据的时候,自动以自增约束字段的最大值加 1 为新的字段值。

mysql> describe goodsmaster;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| barcode    | text         | YES  |     | NULL    |                |
| goodname   | text         | YES  |     | NULL    |                |
| price      | decimal(5,2) | YES  |     | NULL    |                |
| itemnumber | int          | NO   | PRI | NULL    | auto_increment |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.02 sec)

mysql> insert into demo.goodsmaster (itemnumber, barcode, goodname, price) values (100, '0005', 'test_auto_incre', 1.1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from demo.goodsmaster;
+---------+-----------------+-------+------------+
| barcode | goodname        | price | itemnumber |
+---------+-----------------+-------+------------+
| 001     | book            |  0.47 |          1 |
| 002     | pen             |  0.44 |          2 |
| 003     | rubber          |  0.19 |          3 |
| 0005    | test_auto_incre |  1.10 |        100 |
+---------+-----------------+-------+------------+
4 rows in set (0.00 sec)

mysql> insert into demo.goodsmaster (barcode, goodname, price) values ('0006', 'pencil', 0.5);
Query OK, 1 row affected (0.01 sec)

mysql> select * from demo.goodsmaster;
+---------+-----------------+-------+------------+
| barcode | goodname        | price | itemnumber |
+---------+-----------------+-------+------------+
| 001     | book            |  0.47 |          1 |
| 002     | pen             |  0.44 |          2 |
| 003     | rubber          |  0.19 |          3 |
| 0005    | test_auto_incre |  1.10 |        100 |
| 0006    | pencil          |  0.50 |        101 |
+---------+-----------------+-------+------------+
5 rows in set (0.00 sec)

修改表

创建一个进货单历史表(importheadhist),用来存储验收过的进货数据。这个表的结构跟进货单表类似,只是多了 2 个字段,分别是验收人(confirmer)和验收时间(confirmdate)。针对这种情况,很容易想到可以通过复制表结构,然后在这个基础上通过修改表结构,来创建新的表。

首先,把原来的表结构复制一下,create table demo.importheadhist like demo.importhead;

mysql> create table demo.importheadhist like demo.importhead;
Query OK, 0 rows affected (0.08 sec)

mysql> describe importheadhist;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| listnumber    | int           | YES  |     | NULL    |       |
| supplierid    | int           | YES  |     | NULL    |       |
| stocknumber   | int           | YES  |     | NULL    |       |
| importtype    | int           | YES  |     | 1       |       |
| quantity      | decimal(10,3) | YES  |     | NULL    |       |
| importvalue   | decimal(10,2) | YES  |     | NULL    |       |
| recorder      | int           | YES  |     | NULL    |       |
| recordingdate | datetime      | YES  |     | NULL    |       |
+---------------+---------------+------+-----+---------+-------+
8 rows in set (0.01 sec)

一个跟 demo.importhead 有相同表结构的空表 demo.importheadhist,就被创建出来了。这个新创建出来的表,还不是我们需要的表,我们需要对这个表进行修改,通过添加字段和修改字段,来获得我们需要的“进货单历史表”。

添加字段

给这个新的表增加 2 个字段:confirmer 和 confirmdate,

mysql> alter table demo.importheadhist add confirmer int;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table demo.importheadhist add confirmdate datetime;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe importheadhist;
+---------------+---------------+------+-----+---------+-------+
| Field         | Type          | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| listnumber    | int           | YES  |     | NULL    |       |
| supplierid    | int           | YES  |     | NULL    |       |
| stocknumber   | int           | YES  |     | NULL    |       |
| importtype    | int           | YES  |     | 1       |       |
| quantity      | decimal(10,3) | YES  |     | NULL    |       |
| importvalue   | decimal(10,2) | YES  |     | NULL    |       |
| recorder      | int           | YES  |     | NULL    |       |
| recordingdate | datetime      | YES  |     | NULL    |       |
| confirmer     | int           | YES  |     | NULL    |       |
| confirmdate   | datetime      | YES  |     | NULL    |       |
+---------------+---------------+------+-----+---------+-------+
10 rows in set (0.01 sec)

查看表的结构,在字段的最后,多了两个字段:数据类型是 INT 的 “confirmer”,类型是 DATETIME 的 “confirmdate"。

修改字段

把字段名称“quantity”改成“importquantity”,并且把字段类型改为 DOUBLE:

mysql> alter table demo.importheadhist change quantity importquantity double;
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe importheadhist;
+----------------+---------------+------+-----+---------+-------+
| Field          | Type          | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| listnumber     | int           | YES  |     | NULL    |       |
| supplierid     | int           | YES  |     | NULL    |       |
| stocknumber    | int           | YES  |     | NULL    |       |
| importtype     | int           | YES  |     | 1       |       |
| importquantity | double        | YES  |     | NULL    |       |
| importvalue    | decimal(10,2) | YES  |     | NULL    |       |
| recorder       | int           | YES  |     | NULL    |       |
| recordingdate  | datetime      | YES  |     | NULL    |       |
| confirmer      | int           | YES  |     | NULL    |       |
| confirmdate    | datetime      | YES  |     | NULL    |       |
+----------------+---------------+------+-----+---------+-------+
10 rows in set (0.01 sec)

如果不想改变字段名称,只想改变字段类型,例如,把字段“importquantity”类型改成 DECIMAL(10,3):

mysql> alter table demo.importheadhist modify importquantity decimal(10, 3);
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe importheadhist;
+----------------+---------------+------+-----+---------+-------+
| Field          | Type          | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| listnumber     | int           | YES  |     | NULL    |       |
| supplierid     | int           | YES  |     | NULL    |       |
| stocknumber    | int           | YES  |     | NULL    |       |
| importtype     | int           | YES  |     | 1       |       |
| importquantity | decimal(10,3) | YES  |     | NULL    |       |
| importvalue    | decimal(10,2) | YES  |     | NULL    |       |
| recorder       | int           | YES  |     | NULL    |       |
| recordingdate  | datetime      | YES  |     | NULL    |       |
| confirmer      | int           | YES  |     | NULL    |       |
| confirmdate    | datetime      | YES  |     | NULL    |       |
+----------------+---------------+------+-----+---------+-------+
10 rows in set (0.01 sec)

在字段 supplierid 之后,添加一个字段 suppliername,数据类型是 TEXT:

mysql> alter table demo.importheadhist add suppliername text after supplierid;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> describe importheadhist;
+----------------+---------------+------+-----+---------+-------+
| Field          | Type          | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| listnumber     | int           | YES  |     | NULL    |       |
| supplierid     | int           | YES  |     | NULL    |       |
| suppliername   | text          | YES  |     | NULL    |       |
| stocknumber    | int           | YES  |     | NULL    |       |
| importtype     | int           | YES  |     | 1       |       |
| importquantity | decimal(10,3) | YES  |     | NULL    |       |
| importvalue    | decimal(10,2) | YES  |     | NULL    |       |
| recorder       | int           | YES  |     | NULL    |       |
| recordingdate  | datetime      | YES  |     | NULL    |       |
| confirmer      | int           | YES  |     | NULL    |       |
| confirmdate    | datetime      | YES  |     | NULL    |       |
+----------------+---------------+------+-----+---------+-------+

小结

约束,包括默认约束、非空约束、唯一性约束和自增约束等。

  • 默认值约束:就是给字段设置一个默认值
  • 非空约束:就是声明字段不能为空值
  • 唯一性约束:就是声明字段不能重复
  • 自增约束:就是声明字段值能够自动加 1,且不会重复

在修改表时,可以通过修改已经存在的表创建新表,也可以通过添加字段、修改字段的方式来修改数据表。

常用的创建表的 SQL 语句:

create table
(
字段名 字段类型 primary key
);

create table
(
字段名 字段类型 not NULL
);

create table
(
字段名 字段类型 unique
);

create table
(
字段名 字段类型 default);

-- 这里要注意自增类型的条件,字段类型必须是整数类型。
create table
(
字段名 字段类型 auto_increment
);

-- 在一个已经存在的表基础上,创建一个新表
create table demo.importheadhist like demo.importhead;

-- 修改表的相关语句
alter table 表名 change 旧字段名 新字段名 数据类型;
alter table 表名 add column 字段名 字段类型 first|after 字段名;
alter table 表名 modify 字段名 字段类型 first|after 字段名;

参考:创建表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值