MySQL基础知识(二)——数据表和约束

一.数据表

1.概述

数据表(或称表)是数据库最重要的组成部分之一,是其他对象的基础。

2.使用数据库

创建数据表之前要打开数据库,并使用数据库(命令:USE database_name;

可以使用命令:SELECT  DATABASE(); 展示当前使用的数据库。

3.创建数据表

语法:CREATE TABLE [IF NOT EXISTS] table_name (column_name data_type,...)

# 创建一个简单的用户表
 CREATE TABLE IF NOT EXISTS user(
    username VARCHAR(20), 
    age TINYINT UNSIGNED
  );

4.查看数据表列表

SHOW TABLES [FROM db_name][LIKE 'pattern' | WHERE expr]

# 查看当前数据库下的表
SHOW TABLES;
# 查看mysql数据库下的表,不会切换使用的库
SHOW TABLES FROM mysql;

5.查看数据表结构

  • SHOW COLUMNS FROM tbl_name;
  • DESC  tbl_name;

6.插入数据

语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (val,...)

# 不写字段名称则必须给所有字段赋值
INSERT USER VALUES ('kim',18);
# 写字段名称可以只赋对应字段值
INSERT USER(username) VALUES ('kimtian');

7.空值与非空

  • NULL,字段值可以为空
  • NOT NULL 字段值禁止为空

8.自动编号AUTO_INCREMENT

  • 自动编号,且必须与主键组合使用
  • 默认情况下,起始值为1,每次的增量为1

       自动编号字段可以是整数或是浮点数,浮点数的小数位一定为0。

       自动编号的字段一定得是主键,但主键不一定是AUTO_INCREMENT。

二.约束

约束可以保证数据的完整性和一致性;约束分为表级约束和列级约束。

1.PRIMARY KEY主键约束

  • 每张数据表只能存在一个主键
  • 主键保证记录的唯一性
  • 主键自动为NOT NULL
# 自增主键,使用 PRIMARY KEY
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 自增主键,直接使用 KEY也是OK的,但建议直接使用 PRIMARY KEY,可读性好,比较统一
CREATE TABLE IF NOT EXISTS user5(id INT(2) UNSIGNED AUTO_INCREMENT KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 非自增主键
CREATE TABLE IF NOT EXISTS user6(id INT(2) UNSIGNED PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);

创建完成后,可以使用desc tablename;命令,查看表结构,主键是否增加成功。

如图所示可以看到主键创建成功。

  

2.UNIQUE KEY 唯一约束

  • 唯一约束可以保证记录的唯一性;
  • 唯一约束的字段可以为NULL;
  • 每张数据表可以存在多个唯一约束。
# 为username字段 设置唯一约束
CREATE TABLE IF NOT EXISTS user4(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,username VARCHAR(20) UNIQUE KEY,age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);

创建完成后,可以使用命令desc tablename;,查看表结构,唯一约束是否增加成功。

如图所示可以看到唯一约束创建成功。

 

设置唯一约束的元素要有唯一性不能重复。如果username重复数据库会报错:

ERROR 1062 (23000): Duplicate entry 'kimtian' for key 'username'

3.DEFAULT 默认约束 

  • 默认值;
  • 当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。
# 为sex性别字段设置默认值,1表示男,2表示女,3表示保密,不传时候默认为3
CREATE TABLE tbl(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3');

 向表table中插入一条数据:

# 只给年龄赋值了
insert tbl (age) VALUES (18); 

我们没并没有给性别赋值。查看表数据,可以看到性别默认被填写了3。

4.NOT NULL 非空约束

# area地域字段不能为空
CREATE TABLE tbl1(id INT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,age TINYINT UNSIGNED,sex ENUM('1','2','3') DEFAULT '3',area varchar(20) NOT NULL);

area地域字段不能为空,所以我们在插入数据时候,必须给area字段赋值,否则会报错:ERROR 1364 (HY000): Field 'area' doesn't have a default value

同样如果给area赋值NULL也会报这个错误:

5.FOREIGN KEYp 外键约束

  • 保证数据一致性,完整性;
  • 实现一对一或一对多关系。

创建外键约束的要求:

  • 父表和子表必须使用相同的存储引擎,而且禁止使用临时表;
  • 数据表的存储引擎只能为InnoDB;
  • 外建列和参照列必须具有相似的数据类型。其中数字长度或是否有符号位必须相同,而字符的长度则可以不同;
  • 外键列和参照列必须创建索引,如果外键列不存在索引的话,MySQL将会自动创建索引。

如下,创建两张表,一张省份表,一张城市表,城市表有个外键pid,参照省份表的id列。

# 省份表--参照表,也称作父表,id为参照列。
CREATE TABLE provinces(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pname VARCHAR(20) NOT NULL);
# 城市表--子表,pid为外键列。
CREATE TABLE citys(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id));

外键约束的参照条件:

CASCADE 从父表删除或更新时,自动删除和更新子表中匹配的行。
SET NULL 从父表删除或更新行时,设置子表中的外键列为NULL,如果使用该选项,必须保证子表外键列没有指定NOT NULL。
RESTRICT 拒绝对父表的更新或删除操作。
NO ACTION 标准SQL的关键字,在MySQL中与RESTRICT相同。
默认 拒绝对父表的更新或删除操作。

用法如下: 

# ON DELETE CASCADE 删除时,自动删除和更新子表中匹配的行。
CREATE TABLE citys1(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED, FOREIGN KEY (pid) REFERENCES provinces(id) ON DELETE CASCADE);

使用命令SHOW CREATE TABLE tbl_name;

可以查看到以下信息:

(1)ENGINE=InnoDB引擎是InnoDB。

(2)KEY `pid` (`pid`)。外键列pid已经被自动创建了索引。

(3)CONSTRAINT `citys_ibfk_1` FOREIGN KEY (`pid`) REFERENCES `provinces` (`id`)外键索引被成功创建,外键索引名称为citys_ibfk_1。

 也可以使用命令SHOW INDEX FROM tab_name;查看表中索引情况。

6.表级约束与列级约束

表级约束 列级约束
对多个数据列建议的约束,称为表级约束。 对一个数据列建立的约束,称为列级约束。
只能在列定义后生命 可以在列定义时声明,也可以在列定义后声明。

很少使用。

常用。

只支持外键约束,主键约束,唯一约束。不支持非空约束 和 默认约束。

外键约束,主键约束,唯一约束,非空约束,默认约束全都支持。

 三.修改数据表

1.添加和删除列

(1)添加单列

语法:ALTER TABLE tbl_name ADD [COLUMN] col_name column_definaition [FIRST | AFTER col_name]

如果后面[FIRST | AFTER col_name]这部分省略,则新增字段默认加在所有列的后面。

#testalter1字段加在了最前面
ALTER TABLE citys ADD testalter1 varchar(20) FIRST;
#testalter2字段加在了cityname字段的后面
ALTER TABLE citys ADD testalter2 varchar(20) AFTER cityname ;
#后面省略默认加在所有列的最后面
ALTER TABLE citys ADD testalter3 varchar(20);

再查看表结构可以看到新增了3个字段,位置和我们要求的一致。

(2)添加多列

语法:ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definaition,...)

# 多列不能指定位置,默认加在所有列的最后面
ALTER TABLE citys ADD (testalter4 varchar(20),testalter5 varchar(20)  );

(3)删除列

语法:ALTER TABLE tbl_name DROP [COLUMN] col_name 

# 删除单列
ALTER TABLE citys DROP testalter1;
# 删除多列
ALTER TABLE citys DROP testalter2, DROP testalter3, DROP testalter4;
# 删除某列,并增加num列
ALTER TABLE citys DROP testalter5 , ADD num int(20) AFTER cityname;

2.添加和删除主键约束

(1)添加主键约束

ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] PRIMARY KEY [index_type] (index_col_name)

# [CONSTARAINT [symbol]] 表示约束的名称
# [index_type]表示索引的类型,有hash树和B树索引,现在默认是B树 
# 创建user表,未给任何约束
CREATE TABLE IF NOT EXISTS user(id INT(2) UNSIGNED ,username VARCHAR(20),age TINYINT UNSIGNED,salary FLOAT(9,2) UNSIGNED);
# 添加主键约束
ALTER TABLE user ADD CONSTRAINT pk_user_id PRIMARY KEY(id);

使用命令desc user;查看表结构,可以看到id字段加了PRIMARY KEY.

(2)删除主键约束

语法:ALTER TABLE tbl_name DROP PRIMARY KEY

# 删除主键约束,并不用指定名称,因为任何一个数据表有且只有一个主键
ALTER TABLE user DROP PRIMARY KEY;

再次使用命令desc user;查看表结构,可以看到id字段的主键约束已经被删除。

3.添加和删除唯一约束

(1)添加唯一约束

ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type](index_col_name,...)

# 添加唯一约束,唯一约束可以有多个
ALTER TABLE user ADD UNIQUE(username);

使用命令desc user;查看表结构,可以看到username字段加了UNIQUE KEY. 

2)删除唯一约束

ALTER TABLE tbl_name DROP {INDEX | KEY} index_name

# 删除唯一约束,唯一约束要指定名称,因为可能有多个唯一约束
ALTER TABLE user DROP INDEX username;

4.添加和删除外键约束

(1)添加外键约束

ALTER TABLE tbl_name ADD [CONSTARAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) reference_definition

# 创建一个城市表
CREATE TABLE citys(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,cityname VARCHAR(20) NOT NULL,pid SMALLINT UNSIGNED);
# 添加外键约束
ALTER TABLE citys ADD FOREIGN KEY(pid) REFERENCES provinces(id);

使用命令SHOW CREATE TABLE citys ;可以看到加上了外键约束。

(2)删除外键约束

ALTER TABLE tbl_name DROP  FOREIGN KEY fk_symbol

# 删除外键约束
ALTER TABLE citys DROP FOREIGN KEY citys_ibfk_1;
# 删除索引(外键约束删除后MySQL自动加的索引依然存在,需要的话可以继续删除索引)
ALTER TABLE citys DROP INDEX pid;

5.添加和删除默认约束

(1)添加默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

# 添加默认约束,给age字段默认值为15
ALTER TABLE user ALTER age SET DEFAULT 15;

使用命令desc user;查看表结构,可以看到age字段加了Default默认值15。

(2)删除默认约束

ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

# 删除默认约束
ALTER TABLE user ALTER age DROP DEFAULT;

使用命令desc user;查看表结构,可以看到age字段的默认值被删除。

6.修改列定义

(1)修改列定义

ALTER TABLE tbl_name MODIFY [COLUMN] col_name column_definaition [FIRST | AFTER col_name]

# 列名字不存在问题,但定义类型和顺序有问题使用MODIFY
# 修改位置,字段类型不变
ALTER TABLE user MODIFY salary FLOAT(9,2) UNSIGNED AFTER username;
# 修改类型.要注意大类型改到小类型有可能造成数据的丢失。
ALTER TABLE user MODIFY age INT(2) UNSIGNED AFTER id;

7.数据表和数据列更名

尽量少使用数据表更名和数据列名更名。因为创建了索引,或曾经使用过视图和存储过程的情况下,修改可能会导致某些视图和存储过程无法正常工作。

(1)修改列名称

ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definaition [FIRST | AFTER col_name]

# 修改列定义和列名称
ALTER TABLE user CHANGE id user_id TINYINT(2) FIRST;

(2)修改表名称

方法一:

ALTER TABLE tbl_name RENAME [TO | AS] new_tbl_name

方法二:

RENAME TABLE tbl_name TO new_tbl_name [,tbl_name2 TO new_tbl_name]

# 修改表名称--方法一
ALTER TABLE user RENAME user10;
# 修改表名称--方法二,可以多张表更名
RENAME TABLE user1 TO user11,user2 TO user12;

猜你喜欢

转载自blog.csdn.net/third_/article/details/85164504