一. 创建表
上一章时,我们学习了 MySQL的数据类型, 就像Java 知道了 int,string 之后,就该学习类了, 现在,我们知道了数据类型,就该去学习表 Table了。
在创建表时,一定要在 database 里面进行创建, 既先使用 use 数据库名来选择数据库, 再进行创建, 否则会提示 “No database selected” 的错误。
创建表语句:
create table 表名( 列名1 数据类型 [列级别约束条件] [默认值], 列名2 数据类型 [列级别约束条件] [默认值], ...... 列名n 数据类型 [列级别约束条件] [默认值], [表级别约束条件] );
其中 表名,列名1,列名2,列名n 就像Java 里面的变量一样,不能用关键字。 但与Java 不同的是, MySQL不区分大小写。 这一点,与HTML一样。
一.一 查询该数据库下所有的表
使用 show tables; 命令进行查询该数据库下的表。
要先使用 use 数据 库名先选择数据库。 使用 yuejl数据库。
查询所具有的表 show tables;
这个表 t 是上一章在测试timestamp时创建的。
一.二 创建一个简单的表 temp1
创建一个简单的表, 里面只有一个字段 name, 类型是 varchar 类型, 长度是10.
不要忘记 先 use 数据库名 来选择数据库。
按照上面的创建表的语句进行创建:
create table t2( name varchar(10) );
一.三 创建一个复杂的表 temp2
创建一个复杂的表,与老蝴蝶常用的User.java 类一样,具有 id(int类型),name(varchar类型),sex(varchar类型),age(int类型),description(varchar类型) 五个字段。
(创建时,要按照一定的层次进行书写,这样显的帅气。)
create table t3( id int(11), name varchar(20), sex varchar(10), age int(3), description varchar(100) );
一.四 展示所有的表
用 show tables; 命令进行展示
刚才的两个表 t2,t3 放置到这里面了。
一.五 创建表时常见错误
1 . 表名已经存在, 会报 表已经存在的错误
2 . 列名最后一个 写添加了 , 号, 报错。
3 . 列与列之间,没有加 ,号报错
要想 用sql语句创建表时,不报错,只有多练,多写。 前期学习者建议用sql去创建表,不建议使用数据库连接工具去创建表。
二. 约束条件
二.一 约束条件的由来
我们在创建表的命令时, 用这么两个东西, 列级别约束条件和表级别约束条件。 约束条件是干什么用的呢? 用什么作用效果呢?
数据库是存储,管理和操作数据的的仓库, 而表是真正存储数据的, 更准确的说,所有的数据都是放置在表里面的。 我们希望在存储数据之前,就希望能对数据进行一下验证, 就像 Web网站里面的前端验证和后端数据验证, 登录过滤器,权限过滤器一样, 使正确的数据才能够正常的插入,使错误的数据不能够正常插入,提示报错, 使表有个自我检查的功能。 数据库设计者们发现有这么几个常用的小验证,小约束:
1 . 这个列上面的属性值 必须要存在。 这就是非空约束
2 . 这个列上面的属性值必须要唯一,不能重复。 这就是唯一约束
3 . 这个列或者这两个列可以唯一确定这一行,这一行能够通过这个列或者这两列与 其他的行区别开来。 这就是主键约束
4 . 这个列上的值如果没有手动填充值,数据库表默认提供一下,如性别,没有填写,默认是男。 这就是默认值约束
5 . 这个列的值是往上增加的,并且与它上一行的值有关系。 如 num次数, 它上一行的值是1, 它这一行的值是2, 它下一行的值是 3 ,下下一行的值是4。 希望这个1,2,3,4 是表自己递增的, 并不是手动插入的。 这就是自增约束。
6 . 这个列上的值,一定来源于其他表中的值,并不是凭空出现的。发生在两个表之间。 如员工的部门属性的值,一定来源于部门表中的值。 这就是外键约束
7 . 这个列上的值,只能是规定好的值,不能是其他以外的值。 如性别, 只能是男或者女。 手动添加其他值,包括 保密,未知,太监,人妖 之类的,都不能正确插入。 这叫做检查约束(MySQL数据库中不起作用)。
其中,1,2,3,4,5,7 是发生在一个表内的约束, 而6是发生在两个表之间的约束。
上面专业的说法,叫做 数据完整性。
数据完整性分为三个部分:
1 . 实体完整性
2 . 域完整性
3 . 引用完整性
实体完整性这项规则要求每个数据表都必须有主键,而作为主键的所有字段,其属性必须是独一及非空值。
限制字段中的数据必须乎合预设的数据类型。
参照的完整性不允许关系中有不存在的实体引用。
使用约束,可以很方便的保证插入数据的正确性,避免逻辑错误数据的出现,但不能保证业务错误数据的出现。 业务错误数据,需要通过业务流程控制来避免。
二.二 约束条件的分类
- 主键约束 Primary Key (简称 PK)
- 非空约束 Not Null
- 唯一约束 Unique
- 外键约束 Foreign Key (简称 FK)
- 默认约束 Default
- 检查约束 Check(MySQL中不起作用)
- 自增约束 AUTO_INCREMENT
下面,老蝴蝶分别对其进行详细的讲解。
三. 主键约束 Primary Key
主键约束 分为两种, 一种是 单字段主键, 另外一种是多字段联合主键。
三.一 单字段主键
1 . 在创建字段时, 指定 列级别约束条件
列名 数据类型 Primary Key [默认值]
如:
create table pk4( id int(11) primary key, name varchar(10) );
2 . 在创建完所有列之后, 指定 表级别约束条件
[constraint 约束名] primary key (列名)
其中, 约束名通常命名为: PK_表名。 常常省略 constraint 约束名, 直接用 primary key (列名)
create table pk5( id int(11), name varchar(10), primary key (id) );
三.二 多字段联合主键
多字段联合主键只能使用 表级别约束条件
[constraint 约束名] primary key (列名1,列名2)
也常常省略 constraint 约束名。
如 创建学生与课程 的成绩表。 其中,学生编号和课程编号是联合 主键。
create table pk6( stuId int(11), -- 学生编号 courseId int(11), -- 课程编号 score double(5,2), primary key (stuId,courseId) );
三.三 演示主键约束
用 pk4 表做例子吧。 (关于数据的插入,后面章节会详细讲解)
1 . 先插入一个编号为 1,名称为两个蝴蝶飞 的记录。
insert into pk4(id,name) values(1,'两个蝴蝶飞');
2 . 再插入一个编号为1,名称为老蝴蝶的记录。
insert into pk4(id,name) values(1,'老蝴蝶');
编号 id是重复的,不能重复性插入, 会报错。