您的当前位置:首页>全部文章>文章详情

【MySql】表的创建与修改

CrazyPanda发表于:2023-12-08 18:16:35浏览:428次TAG:

文章目录


表:怎么创建和修改数据表

创建和修改数据表,是数据存储过程中的重要一环。我们不仅需要把表创建出来,还需要正确的设置限定条件,这样才能确保数据的一致性和完整性。

同时,表中的数据会随着业务需求的变化而变化,添加和修改相应的字段也是常见的操作。

在一个简单的超市项目中,客户经常需要进货,这就需要在MySQL数据库里面创建一个表,来管理进货的相关数据。假设这个表叫做进货单头表(importhead),如下图所示:

ad7dd57f5efacbfbe8c6c2f3ebb80bd9.jpeg

这里的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创建表的语法,加了默认值1
  
  	importtype 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为例子:

ad7dd57f5efacbfbe8c6c2f3ebb80bd9.jpeg

barcode代表条码,goodsname代表名称。为了防止条码重复,我们可以定义字段barcode满足唯一性约束。这样的话,条码就不能重复,但是可以为空。

同理,为了防止名称重复,我们可以定义字段goodsname满足唯一性约束。但是,无论是条码还是名称都可能重用或者可能为空,所以都不适合做主键。因此对于这张表来说,可以添加一个满足唯一性要求的新字段来做主键。

3、自增约束

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

我们还是来借助商品信息表来讲解:

ad7dd57f5efacbfbe8c6c2f3ebb80bd9.jpeg

从这个表中,我们可以看到,这三个字段都不能满足唯一性,所以没有任何一个字段可以做主键,因此我们需要自己添加一个字段itemnumber,并且每次添加一条数据的时候,要给值增加1。

如何实现呢?我们可以通过定义自增约束的方式,让系统帮我们赋值,从而满足唯一性,这样就可以做主键了。

ad7dd57f5efacbfbe8c6c2f3ebb80bd9.jpeg

有两点需要注意:

  • 在数据表中,只有整数类型的字段才可以有自增约束。自增约束的字段,每增加一条数据,只会自动增加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;

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)

猜你喜欢

【MySql】存储与字段
文章目录1. 存储:一个完整的存储过程是怎样的?·创建MySQL数据库·确认字段·创建数据表·插入数据2. 字段:那么多字段类型,该怎么定义?·整数类型·浮点数类型和定点数类型·文本类型·日期与时间类型1. 存储:一个完整的存储过程是怎样的?在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。·创建MySQL数据库数据存储的第一步就是创建数据库。为什么不是直接创建数据表,而是创建一个数据库呢?从系统架构层次上看,MySQL数据库系统从大到小
发表于:2023-12-08 浏览:376 TAG:
【MySql】MySQL产生死锁的根本原因及解决方法
概念死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程一、 什么是死锁死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.二、 死锁产生的四个必要条件互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只
发表于:2024-03-13 浏览:292 TAG:
【MySql】mysql如何正确设置主键?
文章目录主键:如何正确设置主键?业务字段做主键自增字段做主键手动赋值字段做主键主键总结主键:如何正确设置主键?前面我们在讲解存储的时候,有提到过主键,它可以唯一标识表中的某一条记录,对数据表来说非常重要。当我们需要查询和引用表中的一条数据记录的时候,最好的办法就是通过主键。只有合理地设置主键,才能确保我们准确、快速的找到所需要的数据记录。下面我们借助超市项目的实际需求,来讲解一下怎么正确设置主键?在超市项目中,店家想进行会员营销,相应的,我们就需要处理会员信息。会员信息表(demo.member
发表于:2023-12-08 浏览:337 TAG:
【MySQL】MYSQL数据库设计规范
&nbsp;&nbsp; &nbsp; 1、数据库命名规范&nbsp; &nbsp; &nbsp; &nbsp; 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线&amp;#39;_&amp;#39;组成;&nbsp; &nbsp; &nbsp; &nbsp; 命名简洁明确(长度不能超过30个字符);&nbsp; &nbsp; &nbsp; &nbsp; 例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log给数据库加个
发表于:2024-07-17 浏览:248 TAG:
【MySQL】初识数据库
第一篇:初识数据库#一、数据库管理软件的由来#基于我们之前所学,数据要想永久保存,都是保存于文件中,毫无疑问一个文件仅仅只能存在于某一台机器上。&nbsp;如果我们暂且忽略直接基于文件来存取数据的效率问题,并且假设程序所有的组件都运行在一台机器上,那么用文件存取数据,并没有问题。&nbsp;很不幸,这些假设都是你自己意淫出来的,上诉假设存在以下几个问题:1.程序所有的组件就不可能运行在一台机器上##因为这台机器一旦挂掉则意味着整个软件的崩溃,并且程序的执行效率依赖于承载它的硬件,而一台机器的性能
发表于:2024-06-21 浏览:270 TAG: #mysql
【MySql】mysql 数据库通过拷贝data文件恢复(物理恢复)
1、把data内数据库(MySQL5.7.26/data)拷贝到另外一台服务器一个文件夹是一个数据库,看是全部拷贝还是单个拷贝都可以2、&nbsp;删除数据库下的.ibd(数据文件)和.frm(结构文件), db.opt不要删除(db.opt每个数据库文件只有一个)&nbsp;3、执行建表sql,新建一样的表结构(新的要还原的数据库)把原数据库表结构导出一份,导入到新数据库4、执行下面语句删除数据库.ibd文件,从原数据库中拷贝.ibd过来;单表操作删除ALTER&nbsp;TABLE&amp;nbs
发表于:2024-01-24 浏览:327 TAG:
【MySql】如何进行数学计算、字符串处理和条件判断?
文章目录如何进行数学计算、字符串处理和条件判断?数学函数字符串函数条件判断函数总结如何进行数学计算、字符串处理和条件判断?MySQL 提供了很多功能强大,而且使用起来非常方便的函数,包括数学函数、字符串处理函数和条件判断函数等。在很多场景中 ,我们都会用到这些函数,比如说,在超市项目的实际开发过程中,会有这样的需求:会员积分的规则是一元积一分,不满一元不积分,这就要用到向下取整的数学函数 floor();在打印小票的时候,收银纸的宽度是固定的,怎么才能让打印的结果清晰而整齐呢?这个时候,就要用到
发表于:2023-12-07 浏览:384 TAG:
【MySQL】MySQL主从同步实现
要实现MySQL的主从同步,可以按照以下步骤来进行操作:1 配置主服务器确保主服务器的MySQL配置文件my.cnf或my.ini中启动了二进制日志中brinary.log,即设置了log-bin参数为ON。为主数据库创建一个用于复制的用户,并授予复制权限。例如使用以下明命令:Create USER &#39;repl&#39;@&#39;slave_ip_address&#39; INENTIFIED BY &#39;password&#39;;Grant REPLACEACTION SLAV
发表于:2024-06-27 浏览:241 TAG:
【MySql】关于外键和连接, 如何做到关联查询?
文章目录外键和连接:如何做关联查询?如何创建外键?连接关联查询中的误区外键和连接:如何做关联查询?在实际的数据库应用开发过程中,我们经常需要把2个或2个以上的表进行关联,以获取需要的数据。这是因为,为了提高存取效率,我们会把不同业务模块的信息分别存放在不同的表里面。但是,从业务层面上看,我们需要完整全面的信息为经营决策提供数据支撑。还是以超市项目为例,数据库里面的销售流水表一般只保存销售必需的信息,比如商品编号,数量, 价格,金额和会员卡号等。但是,在呈现给超市经营者的统计报表中,只包括这些信息
发表于:2023-12-08 浏览:416 TAG:
【MySql】json字段内数据求和
首先,我们需要使用JSON_EXTRACT函数来解析JSON数据。假设我们的数据表名为data_table,JSON数据字段名为json_data,需要查询的字段为field_name。```sql SELECT&nbsp;JSON_EXTRACT(json_data,&nbsp;&#39;$.field_name&#39;)&nbsp;AS&nbsp;extracted_field FROM&nbsp;data_table;###&nbsp;步骤2:使用JSON函数提取数组内字段 如果字段是一
发表于:2024-09-18 浏览:216 TAG: #mysql