使用DDL语句创建表
知识要点
CREATE TABLE语句
列的数据类型
添加数据类型选项
根据已有的表来创建新表
列选项
表选项
约束
对表名和列名使用反引号
CREATE TABLE语句
对于一个表有列和行,对于列有标题和数据类型
语法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [database_name.]
)
TEMPORARY:指明创建临时表
IF NOT EXISTS:如果要创建的表已经存在,强制不显示错误消息
database_name:数据库名
table_name:表名
column_name:列名
data_type:数据类型
示例: 在名为test的数据库中创建penalties表
CREATE TABLE test.penalties(
paymentno INTEGER NOT NULL PRIMARY KEY,
playerno INTEGER NOT NULL,
payment_date DATE NOT NULL,
amount DECIMAL(7,2) NOT NULL
);
首先test数据库必须已经存在。其次,语句完成后,test数据库不会自动成为当前数据库
确认表创建成功:
DESC test.penalties;
列的数据类型
常用的数据类型有三大类,分别是数字类,字符串,日期时间
数字类
1.整型(正数和负数): 5种
每个整型类型可以指定一个最小显示宽度(M)。这个宽度并不表示存储的值有多大
补充:int(10) unsigned表示该列只能存放正数,插入小数时,会自动将小数点及后边的数字忽略
2.小数类型
decimal[(precision[,scale])]
precision:精度,不包含小数点的数字总位数(1–30)。不指定默认为10
scale:小数位数。如果不指定,默认为0
该类型的同义词:dec,numeric,fixed
示例:create table t1(id decimal(10,3)); ##decimal(10,3) 存的数字长度最长是10位,小数点已经占了3位,也就是整数占7位;小数不足3位会自动补齐,整数超了报错
decimal类型特点:(1)小数位数定数;(2)数值是什么就是什么,不会进行四舍五入等来存储近似值
3.浮点类型
float[(length) | (,)]
double[(precision) | (,)]
主要用来存储小数点前后有很多位数字的值。它和小数类型(decimal)的区别在于小数点的位置可以在任何地方,即小数点是“浮动的”。由于对一个浮点数字来说,可用的存储空间有限,如果一个数字非常大或非常小,将存储这个数字的近似值而不是实际值
float类型特点:(1)小数位数不是固定的;(2)超出存储范围,近似值进行存储
示例:create table t4(id float); ##定义为float类型注:在存储9999999数据时,四舍五入为1000000
浮点数又分为单精度和双精度。区别在于值所保留的存储空间数量不同
在一个浮点数据类型中可以指定长度(length),来确定具体的浮点类型:长度在0—24之间的是单精度浮点数,长度在25—53之间的是双精度浮点数(例如:30的时候精确到15)
4.位类型
位类型
BIT [(LENGTH)]
存储基于位的值。Length取值范围1—64.默认为1
例如,现在有这样一张表,叫做人员表注:我们将属性一列定义为bit类型,其中分别用1或0分别描述属性列中的值注:bit(6)表示存储长度为6;插入数据时需要使用b指定插入的是bit数据类型;查看数据时需要使用bin指定查看的是bit数据类型。
字符串
字符串在存储的时候,会在字符集中转换为对应的字符编码进行存储,汉字的字符编码一般是三个字节字符串类型
char[(length)]:固定长度字符串。值少于长度则在尾部自动填充空格。length的单位是字符。取值范围0—255
varchar[(length)]:可变长度字符串。length的单位是字符。取值范围0—65535
long varchar:可变长度字符串。最大长度2的24次方减1个字符
longtext:可变长度字符串。最大长度4G个字符
对于char和varchar,如果长度为0,则只能存储null值或者空字符串’’值
text是varchar的同义词。mediumtext是long varchar的同义词
日期类型
日期类型
date : 3字节 ##存储年月日
datetime: 8字节 ##存储年月日时分秒
time : 3字节 ##存储时分秒
timestamp : 4字节 ##存储年月日时分秒微秒
year[(2) | (4)] : 1字节 ##存储年,存储15年用year(2)
二进制大对象类型
binary: 255个字符
varbinary :65535个字符
blob: 65535字符 ##存储文件,照片等信息(例如:身份证复印件)
long varbinary: 2的24次方减1个字符
long blob: 2的32次方-1个字符 ##可以存储比较大的文件,照片信息
补充:存储文件,照片等时,可以存储在文件系统的某一个目录下,数据库中只存放文件,照片的名字,没有存放真实的文件,照片;也可以指定是blob或者long blob类型,在数据库中存放真实的文件,照片。
添加数据类型选项(数字列上的列选项)
1.在某些字符串类型和所有的数字类型后面,可以指定一个数据类型选项,以改变数据类型的属性和功能,也是对该列上的数据进行一种规范
2.对于字符串类型,可以添加两个类型选项:character set和collate
3.对于bit之外的所有数字类型,可以添加一个或几个类型选项:unsigned zerofill auto_increment、serial default value
示例:
(1)zerofill示例:int(5)表示宽度是5,指定zerofill选项时,宽度不到5时,自动补0,宽度大于5时,int(5)不起作用(2)unsigned示例:表示无符号的,表示只允许正数,如果声明了zerofill,该列会自动设为unsigned(3)auto_increment示例:表示数字依次增长(默认从1开始增长,每次增长1)注释:unsigned表示正数,auto_increment表示依次增长,primary key表示唯一值(主键)
当插入数据时,不需要给id列赋值,数据库会自动赋值,从1开始;也可以手工插入数据,注意不要插入重复数据
补充:auto_increment有一个参数,来指定默认从1开始增长,每次增长1auto_increment_offset | 1 表示从1开始
auto_increment_increment | 1 表示每次增长1
创建临时表
概念:临时表是一张表,用来临时保存一些数据。它只对创建它的用户可见。当会话结束时,MySQL自动删除临时表。
特点:不希望,也没有必要让别人看到;保存或者删除这些数据时,消耗的资源非常少
语法:create temporary table 表名
注:用户可以创建一个和已有的普通表名字相同的临时表。在这种情况下,该用户只能看到临时表而看不见同名的普通表。当临时表被删除后,才可以看到普通表。不过尽量避免名字重复
使用if not exists选项
当创建表时,如果表已经存在了,则MySQL会返回出错消息。添加IF NOT EXISTS选项,则强制不显示这个出错消息。语句执行失败
示例:根据已有的表来创建新表
1.语法1:CREATE TABLE new_tbl LIKE orig_tbl;
这种语法,将从源表复制列名、数据类型、大小、非空约束以及索引。而表的内容以及其它约束不会复制,新表是一张空表。
示例:
CREATE TABLE copy_teams LIKE teams; ##空表但列结构和teams一样
2.语法2:CREATE TABLE new_tbl [AS] SELECT {*|column,…} FROM orig_tbl;
新表的结构由select列表决定。同时把查询返回的结果集中的行插入到目标表中。这种语法同样只能把非空约束带入到新表中。也不会复制索引
示例:
CREATE TABLE copy_teams2 ##将teams表的结构和数据复制到 copy_teams2表中
AS SELECT * FROM teams; ##select语句可以非常复杂
3.如果想控制新表的列名,则在select查询中使用列别名
示例:
CREATE TABLE copy_teams3 AS
SELECT teamno tno,playerno pno,division
FROM teams; ##新表copy_teams3中列有tno,pno和division
4.创建临时表时插入相同的数据;这种方式做练习最合适。当会话结束后,临时表被自动删除,原始表中的内容不受任何影响
示例:
CREATE TEMPORARY TABLE teams ##可以理解为创建teams表的临时表,且名字相同
AS SELECT * FROM teams;
5.通过复杂select语句,根据已有的表来创建新表
示例:列选项
定义列时,除了指定列名字、数据类型、大小之外,还可以指定列选项
default函数
使用DEFAULT定义列的默认值,列一旦定义了默认值,当插入一个新行到表中并且没有给该列明确赋值时,它将自动得到默认值
1.在insert语句中使用default示例:
create table t1(id int,name varchar(10),sex char(1) default ‘f’); ##插入数据时,没有给sex列明确赋值时将默认为f
insert into t1(id,name) values(1,‘xiaoguo’); ##sex列为f
或者使用
inset into t1 values(2,‘xiaoxing’,default); ##sex列是默认值,也是f
2.在update语句中使用default示例:
UPDATE penalties_default
SET amount = DEFAULT; ##将penalties_default表中的amount列中的所有行改为默认值
补充:default在指定默认值时,如果默认值是字符串或者日期类型的话,需要使用单引号
comment函数
1.用来给列添加注释。最多255个字符。注释会保存到数据字典中
示例:
CREATE TABLE student(
id INT NOT NULL PRIMARY KEY
COMMENT ‘学号’);
2.用来给表添加注释
示例:
CREATE TABLE t1(
id INTEGER
) COMMENT ‘测试表’;
补充:
show create table t1 ##可以查看到当时建表的语句
表选项
1.engine
指定表使用的存储引擎。存储引擎决定了数据如何存储以及如何访问,还有事务如何处理。MySQL允许对每个表使用不同的存储引擎。如果在create table语句中没有指定存储引擎,则使用默认的存储引擎
SHOW ENGINES; ##查询所有支持的存储引擎
2.auto_increment
该选项决定了当向表中插入第一行时,自增列得到的第一个值是多少,默认从1开始增长,每次增长1;
可以通过指定参数修改默认值
示例:约束
1.可以为列定义约束。约束主要是防止非法数据进入到表中,确保数据的正确性和一致性(统称数据完整性)。约束也可以防止一个表被删除
2.约束的类型:5种
NOT NULL:非空约束(一般都要使用,列上不能有空值)
UNIQUE:唯一性约束(这个列的值唯一,可以有多个空值,一个表可以有多个unique)
PRIMARY KEY:主键约束(一个表只能有一个主键约束,主键列不能为空并且数据唯一)
FOREIGN KEY:外键约束(外键是一个约束。约束一个表的一个列的数值来自于另外一个表的一个列的数值。例如:成绩表的学号列里的所有数值(学号)来自于学生表的学号列里的数值。外键引用的一定是另一个表的主键或者唯一键)
CHECK:检查约束(MySQL中可以写出CHECK约束,但实际上没有任何作用)Oracle中check用途比较宽泛
示例:
create table t2
(id int primary key, ##id是主键
name varchar(10) unique, ##name列是UNIQUE
sex char(1) not null); ##sex列不能为空
check示例
create table t3(id int check(id>100),name varchar(10)); ##虽然能定义,但是没有作用,照样可以插入id<100的值
3.FOREIGN KEY:外键约束
(1)外键约束又叫做参照完整性约束。具有外键约束的列,因为着它的值不能随便给,必须满足外键所引用的主键的取值。一张表中可以定义多个外键。外键列默认可以给null值。
(2)按照定义,外键必须引用一个主键或者唯一键。引用的主键一般在另外一张表中,也可以是本表的主键。后一种情况通常称为“自引用”。
(3) 父子表的概念:外键所在的表叫做子表,外键所引用的主键所在的表叫做父表。注意,父子表是相对而言的,表a可以是表b的子表,但同时也可以是表c的父表
示例:
create table chengji
(s_id int,k_id int,chengji decimal(5,2),
constraint i_f1 foreign key(s_id) references xuesheng(s_id), ##if_1是新建constraint的别名, foreign…references…是语法格式,表示新建表的s_id列的值来自于xuesheng表的s_id
constraint i_f2 foreign key(k_id) references kemu(k_id); ####if_2是新建constraint的别名,表示新建表的k_id来自于kemu表的k_id注:当前chengji表的s_id列的值来自于学生表中s_id列的值,如果插入不符合数据,或报错,且报错有指出插入数据不符合约束,成绩表的k_id列同理
报错截图:补充
在 information_schema数据库中的TABLE_CONSTRAINTS表中有我们设置的表约束(3)删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么就不允许删除,并抛出异常(默认对外键使用on delete restrict 或on delete no action选项),这是默认删除规则 ,修改(update)也是一样,会报错
总结:只要有引用,就不能对主表的引用值进行删除(delete)和修改(update)
(4)ON DELETE CASCADE:级联删除。当删除当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么连同子行一起删除
示例:create table chengji
(s_id int,k_id int,chengji decimal(5,2),
constraint i_f1 foreign key(s_id) references xuesheng(s_id) on delete cascade,
constraint i_f2 foreign key(k_id) references kemu(k_id) on delete set null;
(5)ON DELETE SET NULL:当删除当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么不删除中,而是将子行的外键列设置为null
(6)此外还有 on update的选项参数,通过修改选项参数可以改变默认的修改规则。可以通过查看help create table获取更多信息。
4.约束定义的时间:
1)、使用CREATE TABLE语句
2)、表已经创建完了,使用ALTER TABLE语句