网站建设专家价格,wordpress更改图标,做网站的公司哪好,企业网站的开发与应用你好#xff0c;我是安然无虞。 文章目录 表#xff1a;怎么创建和修改数据表#xff1f;1. 如何创建数据表#xff1f;2. 都有哪些约束#xff1f;3. 如何修改表#xff1f;添加字段修改字段 表#xff1a;怎么创建和修改数据表#xff1f;
创建和修改数据表#x… 你好我是安然无虞。 文章目录 表怎么创建和修改数据表1. 如何创建数据表2. 都有哪些约束3. 如何修改表添加字段修改字段 表怎么创建和修改数据表
创建和修改数据表是数据存储过程中的重要一环。我们不仅需要把表创建出来还需要正确的设置限定条件这样才能确保数据的一致性和完整性。
同时表中的数据会随着业务需求的变化而变化添加和修改相应的字段也是常见的操作。
在一个简单的超市项目中客户经常需要进货这就需要在MySQL数据库里面创建一个表来管理进货的相关数据。假设这个表叫做进货单头表importhead如下图所示 这里的1、2、3表示门店的三种进货方式分别是配送中心配送、门店采买和供货商直供。
其中1配送中心配送是标准的进货方式。因为超市是连锁经营为了确保商品质量和品类的一致性超过9成的门店进货是通过配送中心进行配送的。因此我们希望这个字段的值能够默认是1这样一来除非有特别的指定否则门店进货单的进货方式就自动设置成1了。
所以现在客户需要一个类似的表来存储进货数据而且进货方式还有3种可能的取值范围需要设置默认值接着往下看
1. 如何创建数据表
首先我们要知道MySQL创建表的语法结构
CREATE TABLE 表名
(
字段名1 数据类型 [字段级别约束] [默认值]
字段名2 数据类型 [字段级别约束] [默认值]
......
[表级别约束]
);在MySQL创建表的语法结构里有一个叫做约束。约束限定了表中数据应该满足的条件。
MySQL会根据这些限定条件对表的数据进行监控防止破坏约束条件的操作执行并提示错误从而确保表中数据的唯一性、合法性和完整性。
接下来我们创建上面提到的进货单表
创建代码如下
create table demo.importhead
(listnumber int,supplierid int, stocknumber int, -- 我们在字段importtype定义为int类型的后面按照MySQL创建表的语法加了默认值1importtype int, default 1,quantity decimal(10,3),importvalue decimal(10,2),recoder int,recodingdate datetime
);注意在创建表时字段名称要避开MySQL的系统关键字原因是MySQL系统保留的关键字都有特定的意义。
OK接下来我们尝试往刚刚的表里面插入一条记录来验证一下对字段importtype定义的默认值约束是否起了作用。
insert into demo.importhead
(
listnumber,
supplierid,
stocknumber,-- 这里我们没有插入字段importtype的值quantity,
importvalue,
recoder,
recodingdate
)
values
(
3456,
1,
1,
10,
100,
1,
2020-12-10
);插入完成后我们来查询一下表的内容
select * from demo.importhead;运行结果如下
mysql select * from demo.importhead;
-------------------------------------------------------------------------------------------------------
| listnumber | supplierid | stocknumber | importtype | quantity | importvalue | recorder | recordingdate |
-------------------------------------------------------------------------------------------------------
| 1234 | 1 | 1 | 1 | 10.000 | 100.00 | 1 | 2020-12-10 00:00:00 |
| 2345 | 1 | 1 | 2 | 20.000 | 2000.00 | 1 | 2020-12-10 00:00:00 |
| 3456 | 1 | 1 | 1 | 20.000 | 2000.00 | 1 | 2020-12-10 00:00:00 |
-------------------------------------------------------------------------------------------------------
3 rows in set (0.00 sec)我们发现字段importtype的值已经是1了。这样通过在创建表的时候设置默认值我们就实现了将该字段的默认值定义为1的目的。
2. 都有哪些约束
刚刚这种给字段设置默认值的做法就是默认约束。设置默认约束插入数据的时候如果不明确给字段赋值那么系统会把设置的默认值自动赋值给字段。
除了默认约束还有主键约束、外键约束、非空约束、唯一性约束和自增约束。
这里我们暂时重点介绍非空约束、唯一性约束和自增约束。
1、非空约束
非空约束表示字段值不能为空如果创建表的时候指明某个字段非空那么添加数据的时候这个字段必须有值否则系统就会提示错误。
2、唯一性约束
唯一性约束表示这个字段的值不能重复否则系统或提示错误。跟主键约束相比唯一性约束要更加弱一点。
在一个表中我们可以指定多个字段满足唯一性约束但是主键约束则是只能有一个这也是MySQL系统决定的。另外满足主键约束的字段自动满足非空约束但是满足唯一性约束的字段则可以是空值。
为了方便理解我们以商品信息表goodsmaster为例子 barcode代表条码goodsname代表名称。为了防止条码重复我们可以定义字段barcode满足唯一性约束。这样的话条码就不能重复但是可以为空。
同理为了防止名称重复我们可以定义字段goodsname满足唯一性约束。但是无论是条码还是名称都可能重用或者可能为空所以都不适合做主键。因此对于这张表来说可以添加一个满足唯一性要求的新字段来做主键。
3、自增约束
自增约束可以让MySQL自动给字段赋值且保证不会重复非常有用但是不容易用好。
我们还是来借助商品信息表来讲解 从这个表中我们可以看到这三个字段都不能满足唯一性所以没有任何一个字段可以做主键因此我们需要自己添加一个字段itemnumber并且每次添加一条数据的时候要给值增加1。
如何实现呢我们可以通过定义自增约束的方式让系统帮我们赋值从而满足唯一性这样就可以做主键了。 有两点需要注意 在数据表中只有整数类型的字段才可以有自增约束。自增约束的字段每增加一条数据只会自动增加1我们可以给自增约束的字段赋值这个时候MySQL会重置自增约束字段的自增基数下次添加的时候自动以自增约束字段的最大值加1为新的字段值。 OK接下来我们测试一下
insert into demo.goodsmaster
(
itemnumber,
barcode,
goodsname,
specification,
unit,
price
)
VALUES
(
-- 指定商品编号为100
100,
0003,
测试1,
,
个,
10
);执行该SQL看到的结果是
mysql select * from demo.goodsmaster;
---------------------------------------------------------
| itemnumber | barcode | goodsname | specification | unit | price |
------------------------------------------------------------
| 1 | 0001 | 书 | 16开 | 本 | 89.00 |
| 2 | 0002 | 地图 | NULL | 张 | 9.90 |
| 3 | 0003 | 笔 | 10支 | 包 | 3.00 |
| 100 | 0003 | 测试1 | | 个 | 10.00 |
------------------------------------------------------------
4 rows in set (0.02 sec)我们发现这个时候item number的值不连续最大值是我们刚刚插入的100.
紧接着我们在插入一条数据
insert into demo.goodsmaster
(
-- 不指定自增字段itemnumber的值
barcode,
goodsname,
specification,
unit,
price
)
VALUES
(
0004,
测试2,
,
个,
20
);执行这个SQL语句结果是
mysql select * from demo.goodsmaster;
------------------------------------------------------------
| itemnumber | barcode | goodsname | specification | unit | price |
------------------------------------------------------------
| 1 | 0001 | 书 | 16开 | 本 | 89.00 |
| 2 | 0002 | 地图 | NULL | 张 | 9.90 |
| 3 | 0003 | 笔 | 10支 | 包 | 3.00 |
| 100 | 0003 | 测试1 | | 个 | 10.00 |
| 101 | 0004 | 测试2 | | 个 | 20.00 |
------------------------------------------------------------
5 rows in set (0.00 sec)我们可以看到系统自动给自增字段itemnumber在最大值的基础上加1赋值为101.
3. 如何修改表
创建完表后我们经常需要修改表下面详细说说
在超市项目中当我们创建新表的时候会出现这样的情况我们前面创建的进货单表是用来存储进货数据的。但是我们还要创建一个进货单历史表importheadhist用来存储验收过的进货数据。这个表的结构跟进货单表类似只是多了 2 个字段分别是验收人confirmer和验收时间confirmdate。针对这种情况我们很容易想到可以通过复制表结构然后在这个基础上通过修改表结构来创建新的表。具体怎么实现呢请接着往下看
首先我们把原先的表结构复制一下代码如下
create table demo.importheadhist
like demo.importhead;执行这条SQL后一个跟demo.importhead有相同结构的空表demo.importheadhist就被创建出来了。
我们还需要对这张新创建的表进行修改来获取我们需要的“进货单历史表”。
添加字段
现在需要给这个新的表增加2个字段confirmer和confirmdate请看下面的代码
mysql alter table demo.importheadhist- add confirmer int; -- 添加一个字段confirmer类型是int mysql alter table demo.importheadhist- add confirmdate datetime; -- 添加一个字段confirmdate类型是datetime下面我们再来看一下表结构
mysql DESCRIBE demo.importheadhist;
----------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------------
| listnumber | int | NO | PRI | NULL | |
| supplierid | int | NO | | NULL | |
| stocknumber | int | NO | | 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.02 sec)修改字段
除了添加字段外我们可能还需要修改字段比如我们要把字段quantity改成importquantity并且把字段类型改成double具体操作如下
alter table demo.importheadhist
change quantity importquantity double;执行这条SQL查看表结构
mysql desc demo.importheadhist;
----------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------------
| listnumber | int | NO | PRI | NULL | |
| supplierid | int | NO | | NULL | |
| stocknumber | int | NO | | 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.02 sec)可以看到字段名称和字段类型都改过来了。
如果我们不想改字段名称只想改变字段类型例如把字段importquantity类型改成decimal(10,3)可以这么写
alter table demo.importheadhist
modify importquantity decimal(10,3);运行SQL语句查看表结构
mysql desc demo.importheadhist;
----------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------------
| listnumber | int | NO | PRI | NULL | |
| supplierid | int | NO | | NULL | |
| stocknumber | int | NO | | 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.02 sec)我们还可以通过SQL语句向表中添加一个字段我们甚至还可以指定添加字段在表中的位置。
比如在字段supplierid之后添加一个字段suppliername数据类型是text
alter table demo.importheadhist
add suppliername text after supplierid;运行这个SQL语句查看表结构
mysql desc demo.importheadhist;
----------------------------------------------------------
| Field | Type | Null | Key | Default | Extra |
----------------------------------------------------------
| listnumber | int | NO | PRI | NULL | |
| supplierid | int | NO | | NULL | |
| suppliername | text | YES | | NULL | |
| stocknumber | int | NO | | 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 | |
----------------------------------------------------------
11 rows in set (0.02 sec)