1. 创建数据表
所谓的创建数据表,指在已经创建好的数据库中建立新表。
1.1创建表的语法形式
数据表属于数据库,所以在创建数据表之前应使用“USE <数据库名>”,即指定当前操作在哪里进行,如果没有选择数据库,会抛出“No database selected”的错误。
创建数据表的语句为
CREATE TABLE
语法规则如下:
CREATE TABLE<表名>
(
字段名1 数据类型 [列级别约束条件] [默认值],
字段名2 数据类型 [列级别约束条件] [默认值],
……
[表级别约束条件]
);
使用CREATE TABLE 创建表时,要指定以下信息:
例子:创建一个关于班级同学的表格class,结构如下表所示:
使用的语句如下:
上图用了SHOW TABLES;
语句查看数据表是否创建成功。
1.2使用主键约束
主键,又称为主码,是表中一列或多列的组合。要使用主键约束,主键列的数据必须唯一。简言之,主键就是一个唯一的标识表中的一条记录,可结合外键来定义不同数据表之间的关系爱,加快数据库查询的速度。主键和记录之间的关系就好比通过我们的身份证号可以唯一标识一个人,它们是一一对应的。
主键有两种类型:单字段主键、多字段联合主键。
字段名1 数据类型 PRIMARY KEY [默认值]
[CONSTRAINT<约束名>] PRIMARY KEY [字段名]
PRIMARY KEY [字段1,字段2,……,字段n]
1.3使用外键约束
外键有什么用呢?外键它用来在两个表的数据之间建立链接,可以是一列或者多列。一个表的外键可以为空值,若不是空值,则每一个外键值必须等于另一个表中主键的某个值。
外键是什么?首先它是表中的一个字段,它会对应某一个表的主键。外键的作用是保证数据引用的完整性和一致性。例如部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。
这时引入两个概念:
下面来看看实际例子,如何创建外键:
例:定义数据表tb_emp5,并在tb_emp5表上创建外键约束。
创建一个部门表tb_dept1,则SQL语句如下:
tb_dept1表结构如下图:
下面定义数据表tb_emp5,让它的键depId作为外键关联到tb_dept1的主键id,SQL语句如下:
mysql> CREATE TABLE tb_dept1(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (1.27 sec)
mysql> CREATE TABLE tb_emp5(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.69 sec)
以上语句执行成功后,在表tb_emp5上添加了名称为fk_emp_dept1的外键约束,外键为deptId,其依赖于表tb_dept1的主键id。
注意:如果出现ERROR cannot add foreign key constraint)
即mysql无法使用外键约束(我也出现了这种情况),我上网查了一下有可能由下列几种情况导致:
第一,请检查数据类型是否一致
第二,请检查数据精度是否一致
第三,请检查字符集和排序规则是否一致
如果上面的都确定没错,请保存数据,删除数据库,再来一遍。
1.4使用非空约束
非空约束指字段的值不能为空。若字段使用了非空字段,当用户添加数据时没有指定值,则数据库系统会报错。
非空约束的语法规则:字段名 数据类型 not null
例:定义数据表tb_emp6,指定员工的名称不能为空,SQL语句如下:
mysql> CREATE TABLE tb_emp6(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept2 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
-> );
Query OK, 0 rows affected (0.63 sec)
执行后,在tb_emp6表中创建了一个name字段,且其插入值不能为空。
1.5使用唯一性约束
唯一性约束要求该列唯一,允许为空,但只能有一个空值。
唯一性约束的语法规则:
(1)在定义完列之后直接指定唯一约束
字段名 数据类型 UNIQUE
例:定义数据表tb_dept2,指定部门的名称唯一,SQL语句如下:
mysql> CREATE TABLE tb_dept2(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) UNIQUE,
-> location VARCHAR(50)
-> );
Query OK, 0 rows affected (0.44 sec)
(2)在定义完所有列之后指定唯一约束
[CONTRAINST<约束名>] UNIQUE(<字段名>)
例:定义数据表tb_dept3,指定部门名称唯一,SQL语句如下:
mysql> CREATE TABLE tb_dept3(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22),
-> location VARCHAR(50),
-> CONSTRAINT STH UNIQUE(name)
-> );
Query OK, 0 rows affected (0.44 sec)
UNIQUE和PEIMARY KEY的区别:
在一个表中允许有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY 声明;声明为UNIQUE的字段允许有空值,而PRIMARY KEY则不然。
1.6使用默认约束
默认约束即指定某列的默认值。
默认约束的语法规则:
字段名 数据类型 DEFAULT 默认值
例:定义数据表tb_emp7,指定员工的部门编号默认为1111,SQL语句如下:
mysql> CREATE TABLE tb_emp7(
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(22) NOT NULL,
-> deptId INT(11) DEFAULT 1111,
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept3 FOREIGN KEY(deptId) REFERENCES tb_dept3(id)
-> );
Query OK, 0 rows affected (0.50 sec)
上述语句执行成功后,表tb_emp7上的字段deptId便拥有了一个默认值1111,新插入的记录如果没有指定部门编号则默认都为1111。
1.7设置表的属性值自动增加
在数据库的应用中,插入新纪录的时候如何快捷的让系统自动生成字段的主键值?我们可以通过为表主键添加AUTO_INCREMENT关键字来实现。
其初始值始终是1,每增加一条新纪录字段值自动加1。
注意:在一个表中只能有一个字段使用AUTO_INCREMENT约束,且该字段必须是主键的一部分,其约束的字段可以是任何整数类型(TINYINT、SMALLIN、INT等)。
设置AUTO_INCREMENT约束的语法规则:
字段名 数据类型 AUTO_INCREMENT
例:定义数据表tb_emp8指定员工的编号自动增加,SQL语句如下:
mysql> CREATE TABLE tb_emp8(
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> name VARCHAR(22) NOT NULL,
-> deptId INT(11),
-> salary FLOAT,
-> CONSTRAINT fk_emp_dept5 FOREIGN KEY(deptId) REFERENCES tb_dept3(id)
-> );
Query OK, 0 rows affected (1.26 sec)
上述例子执行后,会创建名称为tb_emp8的数据表,且其id字段的值在添加记录的时候会自动增加。例如执行下面的语句:
mysql> INSERT INTO tb_emp8(name,salary)
-> VALUES('Lucy',1000),('Lura',1200),('Kevin',1500);
Query OK, 3 rows affected (0.33 sec)
Records: 3 Duplicates: 0 Warnings: 0
语句执行结束后,tb_emp8表中自动增加三条记录,如下:
mysql> SELECT*FROM tb_emp8;
+----+-------+--------+--------+
| id | name | deptId | salary |
+----+-------+--------+--------+
| 1 | Lucy | NULL | 1000 |
| 2 | Lura | NULL | 1200 |
| 3 | Kevin | NULL | 1500 |
+----+-------+--------+--------+
3 rows in set (0.23 sec)
注意:这里使用INSERT声明向表中插入记录的方法,只能在MYSQL中使用。