目录
1.创建数据表
创建数据表的语法格式:
查看当前数据库的表:
主键
1.单字段主键
(1)在定义列的同时指定主键,语法规则如下:
(2)在定义完所有列之后指定主键。
2.多字段联合主键
外键:
非空约束:
唯一性约束:
(1)在定义完列之后直接指定唯一约束,语法规则如下:
(2)在定义完所有列之后指定唯一约束,语法规则如下:
默认约束:
表的属性值自动增加:
2.查看表结构
DESCRIBE/DESC语句可以查看表的字段信息,
查看表详细结构语句SHOW CREATE TABLE
3.修改数据表
修改表名:
修改字段的数据类型
修改字段名:
添加字段:
1、添加无完整性约束条件的字段
2、添加有完整性约束条件的字段
3、在表的第一列添加一个字段
4、在表的指定列之后添加一个字段
删除字段:
修改字段的排列位置:
1、修改字段为表的第一个字段
2、修改字段到表的指定列之后
更改表的存储引擎:
删除表的外键约束:
4、删除数据表
1、删除没有被关联的表:
2、删除被其他表关联的主表:
5、练习题
1、创建数据库Market,在Market 中创建数据表customers,customers 表结构如表4.6所示 并按要求进行操作。
2、在Market中创建数据表orders,orders表结构如表4.7所示,按要求进行操作。
1.创建数据表
创建好数据库之后,接下来就是创建数据表,所谓创建数据表就是在数据库中新建行列式表格。
创建数据表的过程也是规定数据列属性的过程,也是实施数据完整性的约束过程。
注意:创建表之前,要用USE dbname先切换到指定数据库中。
比如:use test.;
就是切换到名称为test的数据库中。
创建数据表的语法格式:
create table <表名>
(
字段名1 数据类型【列级约束条件】 默认值,
字段名2 数据类型【列级约束条件】 默认值,
。。。。。。。
【表级约束条件】
);
比如:
mysql> create table tb_emp1-> (-> id int(11),-> name varchar(25),-> deptid int(11),-> salary float-> );
语句执行后,便创建了一个名称为tb_emp1的数据表,
查看当前数据库的表:
show 数据库名字;
例如:show tables;
主键
主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key.Constraint)要求主键列
的数据雌一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义
不同数据表之间的关系,并且可以加快数据库查询的速度。
主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。
主键分为两种类型:单字段主键和多字段联合主键。
1.单字段主键
单字段主键由一个字段组成,SQL语句格式分为以下两种情况。
(1)在定义列的同时指定主键,语法规则如下:
字段名 数据类型 PRIMARY KEY 【默认值】
比如:定义数据表tb_emp2,其主键为id,SQL语句如下:
mysql> create table tb_emp2-> (-> id int(11) primary key,-> name varchar(25),-> deptid int(11),-> salary float-> );
(2)在定义完所有列之后指定主键。
[CONSTRAINT <约束名>] PRIMARY KEY 【字段名】
比如:定义数据表tb_emp3,其主键为id,SQL语句如下:
mysql> create table tb_emp3-> (-> id int(11),-> name varchar(25),-> deptid int(11),-> salary float,-> primary key(id)-> );
上述两个例子执行后的结果是一样的,都会在id字段上设置主键约束。
2.多字段联合主键
主键由多个字段联合组成,语法规则如下:
PRTMARY KEY [字段1,字段2.字段n]
比如:定义数据表tb_emp4,假设表中间没有主键id,为了唯一确定一个员工
可以把name、deptId.联合起来做为主键,SQL语句如下:
mysql> create table tb_emp4-> (-> name varchar(25),-> deptid int(11),-> salary float,-> primary key(name,deptid)-> );
语句执行后,便创建了一个名称为tb_emp4的数据表,name 段和 deptld 段组合在一 起成为tb_emp4的多字段联合主键。
外键:
外键用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,
若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。
主要作用:是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
创建外键的语法规则如下:
CONSTRAINT <外键名> FOREIGN KEY(字段名1 [,字段名2,...] ) REPERENCES <主表名> (主键列1 [,主键列2,...])
“外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;
“字段名”表示子表需要添加外键约束的字段列;
“主表名”即被子表外键所依赖的表的名称;
“主键列”表示主表中定义的主键列,或者列组合。
比如:首先创建一个部门表tb_dept1,SQL语句如下:
mysql> create table tb_dept1-> (-> id int(11) primary key,-> name varchar(22) not null,-> location varchar(50)-> );
然后定义数据表tb_emp5,并在tb_emp5表上创建外键约束。
让它的键deptId作为外键关联到tb_dept1的主键id,SQL语句为:
mysql> create table tb_emp5 -> (-> id int(11) primary key,-> name varchar(25),-> deptId int(11), -> salary float,-> constraint fk_emp_dept1 foreign key(deptId) references tb_dept1(id)-> );
以上语句执行成功之后,在表tb_emp5上添加了名称为fk_emp_dept1的外键约束,
外键名称为 fk_emp_dept1,其依赖于表tb_dept1的主键id
关联指的是在关系型数据库中相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型 不一样,则创建子表时,就会出现错误“ERROR 1005(HY00):Can't createtable database. tablename'(errno:150)”
非空约束:
非空约束(Not Null Constraint) 指字段的值不能为空,对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
语法规则如下:
字段名 数据类型 not null
比如:定义数据表tb_emp6,指定员工的名称不能为空,SQL语句如下:
create table tb_emp6
(
id int(11) primary key,
name varchar(25) not null,
deptId int(11),
salary float
);
执行后,在tb_emp6中创建了一个Name字段,其插入值不能为空 (NOTNULL)。
唯一性约束:
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。
唯一约束可以确保一列或者几列不出现重复值。
唯一性约束的语法规则如下:
(1)在定义完列之后直接指定唯一约束,语法规则如下:
字段名 数据类型 UNIQUE
比如:
定义数据表tb_dept2,指定部门的名称唯一,SQL语句如下:
create table tb_dept2
(
id INT(11) primary key,
name varchar(22) unique,
location varchar(50)
);
(2)在定义完所有列之后指定唯一约束,语法规则如下:
CONSTRAINT <约束名> UNIQUE (<字段名>)
比如:
定义数据表tb_dept3,指定部门的名称唯一,SQL语句如下:
create table tb_dept3
(
id int(11) primary key,
name varchar(22),
location varchar(50),
constraint hahaha unique(name)
);
注意:UNIQUE(创建唯一性约束)和PRIMARYKEY(外键)的区别:
一个表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARYKEY
声明声明为PRIMAYKEY的列不允许有空值,但是声明为UNIOUE的字段允
许空值(NULL).
默认约束:
默认约束(Default Constraint)指定某列的默认值。如男性同学较多,性别就可以默认’男'
如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值'男'
默认约束的语法规则如下:
字段名 数据类型 DEFAULT 默认值
比如:定义数据表tb_emp7,指定员工的部门编号默认为1111,SQL语句
如下:
create table tb_emp7
(
id int(11) primary key,
name varchar(25) not null,
deptId int(11) default 1111,
salary float
);
以上语句执行成功之后,表tb_emp7上的字段deptld拥有了一个默认的值 1111,
新插入的记录如果没有指定部门编号,则默认都为1111
表的属性值自动增加:
在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的主键值。
可以通过为表主键添加AUTO_INCREMENT关键字来实现默认的,在MySOL 中AUTO_INCREMENT的初始值是 1,每新增一条记录,字段值自动加 1。
一个表只能有一个字段使用AUTO_INCREMENT约束,且该字段必须为主键的一部分。
AUTO INCREMENT约束的字段可以是任何整数类型(TINYINT、SMALLIN、 INT、BIGINT等)。
设置表的属性值自动增加的语法规则如下:
字段名 数据类型 AUTO_INCREMENT
比如:定义数据表tb_emp8,指定员工的编号自动递增,SQL语句如下:
create table tb_emp8
(
id int(11) primary key auto_increment,
name varchar(25) NOT NULL,
deptId int(11),
salary float
);
执行如下插入语句:
insert into tb_emp8 (name,salary) values ("zhangsan",10000);
insert into tb_emp8 (name,salary) values ("lisi",20000);
insert into tb_emp8 (name,salary) values ("wangwu",30000);
语句执行完后,tb_emp8表中增加3条记录,在这里并没有输入id的值,
但系统已经自动添加该值,使用SELECT命令查看记录,如下所示。
SELECT * FROM tb_emp8;
注意:这里使用INSERT 声明向表中插入记录的方法,并不是 SQL 的标准
语法, 这种语法不一定被其他的数据库支持,只能在MySQL中使用。
2.查看表结构
使用SQ儿语句创建好数据表之后,可以查看表结构的定义,以确认表的定义是否正确。
在MySOL中,查看表结构可以使用 DESCRIBE 和 SHOW CREATE TABLE语句。
本节将针对这两个语分别进行详细的讲解。
DESCRIBE/DESC语句可以查看表的字段信息,
其中包括:字段名、字段数据类型、是否为主键、是否有默认值等。
语法规则如下
DESCRIBE 表名
或者简写为:
DESC 表名
比如:分别使用DESCRIBE和DESC查看表tb dept1和表tb emp1的表结构。
查看tb_dept1表结构,SQL语句如下:
其中,各个字段的含义分别解释如下:
NULL:表示该列是否可以存储NULL值。
Key: 表示该列是否已编制索引。
PRI 表示该列是表主键的一部分;
UNI 表示该列是UNIQUE索引的一部分,
MUL 表示在列中某个给定值允许出现多次。
Default:表示该列是否有默认值,如果有的话值是多少
Extra:表示可以获取的与给定列有关的附加信息,例如 AUTO_INCREMENT等
查看表详细结构语句SHOW CREATE TABLE
SHOW CREATE TABLE语句可以用来显示创建表时的CREATE TABLE语语法格式
如下:
SHOW CREATE TABLE <表名 \G>;
使用SHOW CREATE TABLE 语句,不仅可以查看表创建时候的详细语句,
而且还可以查看存储引擎和字符编码。如果不加 \G参数,显示的结果可能非常混乱,加上参数“\G’之后,可使显示结果更加直观,易于查看。
比如:使用SHOW CREATE.TABLE查看表tb_emp1的详细信息,SQL语句如下:
mysql> mysql> show create table tb_emp1
使用参数’\G’之后的结果如下:
mysql> mysql> show create table tb_emp1 \G;
3.修改数据表
修改表指的是修改数据库中已经存在的数据表的结构,MySQL使用ALTER TABLE语句修改表。
常用的修改表的操作有:修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。
修改表名:
MySQL是通过ALTER.TABLE语来实现表名的修改的,具体的语法规则如下
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
其中TO为可选参数,使用与否均不影响结果。
比如:将数据表tb_dept3改名为tb_deptment3。
使用ALTER TABLE将表tb_dept3改名为tb_deptment3,SQL语句如下:
mysql> alter table tb_dept3 rename tb_deptment3;
语句执行之后,检验表tb_dept3是否改名成功。使用SHOW TABLES查看数据库中的表。
在修改表名称时使用DESC命令查看修改前后两个表的结构,修改表名并不修改表的结构, 因此修改名称后的表和修改名称前的表的结构必然是相同的。
修改字段的数据类型
就是把字段的数据类型转换成另一种数据类型。在 MySQL 中修改字段数据类型的语法规则如下:
ALTER TABLE <表名> MODIFY <字段名> <数据类型>
其中“表名”指要修改数据类型的字段所在表的名称,
“字段名”指需要修改的字段“数据类型”指修改后字段的新数据类型。
比如:将数据表tb_dept1中name字段的数据类型由VARCHAR(22)修改成
VARCHAR(30)。
执行修改表名操作之前,使用DESC查看tb_dept表结构,结果如下:
desc tb_dept1;
可以看到现在name字段的数据类型为VARCHAR(22),下面修改其类型。
输入如下SQL语句并执行:
mysql> alter table tb_dept1 modify name varchar(30);
语句执行之后,发现表 tb_deptl 表中name字段的数据类型已经修改成了VARCHAR(30)。
修改字段名:
MySOL中修改表字段名的语法规则如下:
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
其中,“旧字段名”指修改前的字段名:“新字段名”指修改后的字段名;
“新数据类型”指修改后的数据类型,如果不需要修改字段的数据类型,
可以将新数据类型设置成与原来一样即可,但数据类型不能为空。比如:将数据表tb_dept1中的location字段名称改为loc,数据类型保持不变,
SQL语句如下:
alter table tb_dept1 change location loc varchar(50);
原:
现在:
CHANGE 也可以只修改数据类型,实现和MODIFY 同样的效果,
方法是将 SQL语句中 的“新字段名”和“旧字段名”设置为相同的名称,只改变“数据类型”。由于不
同类型的数据在机器中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已有的数据记录。因此,当数据库表中已经有数据时,不要轻易修改数据类型。
添加字段:
随着业务需求的变化,可能需要在已经存在的表中添加新的字段。一个完整字段包括字段名、数据类型、完整性约束。
添加字段的语法格式如下:
ALTER TABLE <表名> ADD <新字段名> <数据类型> [约束条件] [FIRST | AFTER 已存在字段名];
新字段名为需要添加的字段的名称;“FIRST”为可选参数,其作用是将新添加的字段设置为表的第一个字段:“AFTER”为可选参数,其作用是将新添加的字段添加到 指定的"已存在字段名"的后面。
1、添加无完整性约束条件的字段
比如:在数据表tb_dept1中添加一个没有完整性约束的INT类型的字段
managerId
(部门经理编号),SQL语句如下:
mysql> alter table tb_dept1 add managerid int(10);
此方法会将字段添加到最后。
2、添加有完整性约束条件的字段
比如:在数据表tb_dept1中添加一个不能为空的VARCHAR(12)类型的字段column1,
SQL语句如下:
mysql> alter table tb_dept1 add column1 varchar(12) not null;
3、在表的第一列添加一个字段
比如:在数据表tb_dept1中添加一个INT类型的字段column2,SQL语句如 下:
mysql>alter table tb_dept1 add column2 int(11) first;
4、在表的指定列之后添加一个字段
比如:在数据表tb_dept1中name列后添加一个INT类型的字段column3,
SQL语句如下:
mysql> alter table tb_dept1 add column3 int(11) after name;
删除字段:
删除字段是将数据表中的某个字段从表中移除,语法格式如下:
ALTER TABLE <表名> DROP <字段名>;
“字段名”指需要从表中删除的字段的名称
比如:删除数据表tb_dept1表中的column2字段。
删除column2字段,SQL语句如下:
mysql> alter table tb_dept1 drop column2;
修改字段的排列位置:
对于一个数据表来说,在创建的时候,字段在表中的排列顺序就已经确定了。
但表的结构并不是完全不可以改变的,可以通过 ALTER TABLE 来改变表中字段的相对位置。
语法格式如下:
ALTER TABLE <表名> MODIEY <字段1> <数据类型> FIRST | AFTER <字段2>;
“数据类型”指“字段1”的数据类型,
“FIRST”为“字段1”指要修改位置的字段,可选参数,指将“字段1”修改为表的第一个字段,
“AFTER 字段2”指将“字段1”插入到“字段2”后面。
1、修改字段为表的第一个字段
比如:将数据表tb_dept中的column1字段修改为表的第一个字段,SQL语
句如下:
mysql> alter table tb_dept1 modify column1 varchar(12) first;
2、修改字段到表的指定列之后
比如:将数据表tb_dept1中的column1字段插入到loc字段后面,SQL语句如下:
mysql> alter table tb_dept1 modify column1 varchar(12) after loc;
更改表的存储引擎:
通过前面章节的学习,知道存储引擎是 MySQL中的数据存储在文件或者内存中时采用的不同技术实现。可以根据自己的需要,选择不同的引擎,甚至可以为每一张表选择不同的存储引擎。
MySOL中主要存储引擎有:MyISAM、InnoDB、MEMORY(HEAP)BDBFEDERATED等。
可以使用 SHOW ENGINES语查看系统支持的存储引擎。
更改表的存储引擎的语法格式如下:
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
比如:将数据表tb_deptment3的存储引擎修改为MyISAM。
在修改存储引擎之前,先使用SHOW CREATE TABLE查看表tb_deptment3当前的存储引擎
mysql> show create table tb_deptment3 \G
可以看到,表tbdeptment3当前的存储引擎为ENGINE=InnoDB, 接下来修改存储引擎类型,输入如下SOL语句并执行:
mysql> alter table tb_deptment3 engine=myisam;
使用SHOW CREATE TABLE 再次查看表tb_deptment3 的存储引擎,发现表的存储引擎变成了“MyISAM”
删除表的外键约束:
对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系,MySQL中删除外键的语法格式如下:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>
“外键约束名”指在定义表时CONSTRAINT 关键字后面的参数。
比如:
删除数据表tb_emp9中的外键约束。
首先创建表tb_emp9,创建外键deptId关联tb_dept1表的主键id,SQL语句
如下:
create table tb_emp9
(
id int(11) primary key,
name varchar(25),
deptId int(11),
salary float,
constraint fk_emp_dept foreign key (deptId) references tb_dept1(id)
);
使用SHOW CREATE TABLE查看表tb_emp9的结构,结果如下:
mysql> show create table tb_emp9 \G;
可以看到,已经成功添加了表的外键,下面删除外键约束,SQL语句如下
mysql> alter table tb_emp9 drop foreign key fk_emp_dept;
使用SHOW CREATE TABLE再次查看表tb_emp9结构,结果如下:
mysql> show create table tb_emp9 \G;
可以看到,tb_emp9中已经不存在FOREIGN KEY,原有的名称为 emp_dept的外键约束删除成功.
4、删除数据表
删除数据表就是将数据库中已经存在的表从数据库中删除。注意,在删除表的同时,表的定义和表中所有的数据均会被删除。因此,在进行删除操作前,最好对表中的数据做个备份,以免造成无法挽回的后果。本节将详细讲解数据库表的删除方法。
1、删除没有被关联的表:
在MySQL中使用DROP TABLE可以一次删除一个或多个没有被其他表关联的数据表语法格式如下:
DROP TABLE [IF EXISTS] 表1,表2,...表n;
其中“表n”指要删除的表的名称,后面可以同时删除多个表,只需将要删除的表名依次写在后面,
相互之间用逗号隔开即可。如果要删除的数据表不存在,则MySQL会提示一条错误信息
“ERROR 1051(42S02):Unknown table 表名”。参数“IFEXISTS”用于在删除前判断删除的表
是否存在,加上该参数后,再删除表的时候,如果表不存在,SOL 语句可以顺利执行,
但是会发出警告(warning)。
比如:
删除数据表tb_dept2,SQL语句如下:
drop table if exists tb_dept2;
语句执行完毕之后使用SHOW TABLES 命看当前数据库中所有的表SOL语
如下:
执行结果可以看到,数据表列表中已经不存在名称为 tb_dept2 的表,删除操作成功。
2、删除被其他表关联的主表:
数据表之间存在外键关联的情况下,如果直接删除父表,结果会显示失败。原因是直接删除,
将破坏表的参照完整性。
如果必须要删除,可以先删除与它关联的子表再删除父表, 只是这样同时删除了两个表中的数据。但有的情况下可能要保留子表,这时如要单独删除父表,
只需将关联的表的外键约束条件取消,然后就可以删除父表。
下面讲解这种方法。在数据库中创建两个关联表,首先,创建表bdept2,
SOL语句如下:
create table tb_dept2
(
id int(11) primary key,
name varchar(22),
location varchar(50)
);
接下来创建表tb_emp,
SQL语句如下:
create table tb_emp
(
id INT(11) primary key,
name varchar(25),
deptId int(11),
salary float,
constraint fk_emp_dept foreign key (deptId) references tb_dept2(id)
);
使用SHOW CREATE TABLE命令查看表tb_emp的外键约束,结果如下:
可以看到,以上执行结果创建了两个关联表 tb_dept2和表 tb_emp,其中tb
emp表为子表具有名称为fk_emp_dept的外键约束,tb_dept2为父表,其主键id被子表 tb_emp所关联。
现在我们删除被数据表tb_emp关联的数据表tb_dept2。
首先直接删除父表tb_dept2,输入删除语句如下:
drop table tb_dept2;
可以看到,如前所述,在存在外键约束时,主表不能被直接删除。
接下来,解除关联子表temp的外键约束,SOL 语句如下:
alter table tb_emp drop foreign key fk_emp_dept;
语句成功执行后,将取消表 tb emp 和表 tb dept2 之间的关联关系,
此时,可以输入删除语句,将原来的父表tdept2删除,SOL语句如下:
drop table tb_dept2;
最后通过SHOW TABLES 查看数据表列表,如下所示:
可以看到,数据表列表中已经不存在名称为tb_dept2的表.
5、练习题
1、创建数据库Market,在Market 中创建数据表customers,customers 表结构如表4.6所示 并按要求进行操作。
(1)创建数据库Market。
(2)创建数据表customers,在c_num字段上添加主键约束和自增约束,
在c_birth字段上添加非空约束。
(3)将c_contact字段插入到c_birth字段后面。
(4)将c_name字段数据类型改为 VARCHAR(70)。
(5)将c_contact字段改名为c_phone
(6)增加c_gender 字段,数据类型为 CHAR(1)。
(7)将表名修改为customers_info。
(8)删除字段c_city.
(9)修改数据表的存储引擎为MyISAM。
部分代码
create table customers
(
c_num int(11) primary key unique auto_increment,
c_name varchar(50),
c_contact varchar(50),
c_city varchar(50),
c_birth datetime not null
);
2、在Market中创建数据表orders,orders表结构如表4.7所示,按要求进行操作。
(1)创建数据表orders,在o_num字段上添加主键约束和自增约束,
在c_id字段上添加外键约束,关联customers表中的主键c_num。
(2)删除orders 表的外键约束,然后删除表customers。
部分代码
create table orders
(
o_num int(11) primary key auto_increment,
o_date date,
c_id int(11),
constraint a_b foreign key(c_id) references customers_info(c_num)
);