MySQL 约束

约束

约束保证数据的完整性一致性

按约束字段数量划分

列级约束和表级约束

  • 列级约束 对一个数据列建立的约束
  • 表级约束 对多个数据列建立的约束

列级约束既可以在列定义时声明,也可以在列定义后声明; 表级约束只能在列定义后声明.
并不是所有约束都存在表级约束。如NOT NULLDEFAULT约束不存在表级约束.

按功能划分

  • PRIMARY KEY 主键
  • FOREIGN KEY 外键
  • UNIQUE KEY 唯一
  • NOT NULL 非空
  • DEFAULT 默认

主键约束 PRIMARY KEY

主键会自动创建索引.

  • 一张表只能有一个主键
  • 主键保证记录的唯一性
  • 主键自动为NOT NULL

AUTO_INCREMENT只能用于主键,默认从1开始,自增1.

CREATE TABLE tb3(
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,--指定主键
username VARCHAR(30) NOT NULL
);

外键约束 FOREIGN KEY

实现一对一一对多的关系(关系型数据库)

  • 子表: 具有外键列的表
  • 父表: 子表参照的表
外键约束的要求:
  • 1.父表和子表必须均使用InnoDB存储引擎,而且禁止使用临时表,MyISAM表暂时不支持外键
  • 2.外键列参照列必须具有类似的数据类型(比如int和tinyint可以,而int和char则不可以)。其中数字是否有符号位必须相同.
  • 3.MySQL 4.1.2以后的版本在建立外键时会自动创建索引,外键列参照列必须创建索引
  • 4.MySQL中外键参照的外表列不一定是主键,但必须是唯一性索引(UNIQUE)。
修改数据表的默认存储引擎:

mysql配置文件(my.ini):

default-storage-engine=INNODB;
外键约束的参照操作
FOREIGN KEY(pid) REFERENCES provinces (id) ON DELETE CASCADE
  • CASCADE 级联操作,从父表删除或更新行会自动删除或更新子表中匹配的行
  • SET NULL从父表删除或更新行,并设置子表中的外键列为NULL。前提必须保证子表外键列没有非空约束NOT NULL
  • RESTRICT拒绝对父表的删除或更新操作
  • NO ACTION标准SQL的关键字,在MySQL中与RESTRICT相同

唯一约束 UNIQUE KEY

  • 唯一约束可以保证记录的唯一性
  • 唯一约束的字段可以为空值(NULL)
  • 每张数据表可以存在多个唯一约束

唯一约束的字段虽然可以为NULL,却只能有一条记录为NULL,因为要保证唯一性.

CREATE TABLE tb5(  
id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,  
username VARCHAR(20) NOT NULL UNIQUE KEY, --唯一约束
age tinyint UNSIGNED
);

非空约束 NOT NULL

插入记录时,该字段不能为空.

默认约束 DEFAULT

当插入记录时,如果没有明确为字段赋值,则自动赋予默认值。

CREATE TABLE tb6(  
id SMALLINT UNSIGNED AUTO\_INCREMENT PRIMARY KEY,  
username VARCHAR(20) NOT NULL UNIQUE KEY,
sex ENUM('1','2','3') DEFAULT '3'  --默认值为3
);

Tips

修改mysql提示符

mysql -p --prompt '\u@\h \d>'
--......进入数据库
root@localhost (none)>

查看警告信息

SHOW WARNINGS;

查看数据库或表原来的创建命令

SHOW CREATE DATABASE db1;
SHOW CREATE TABLE tb1;

--查看db的编码方式
root@localhost (none)>SHOW CREATE DATABASE t1;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| t1       | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

修改db的编码方式

root@localhost (none)>ALTER DATABASE t1 CHARACTER SET = utf8;
Query OK, 1 row affected (0.00 sec)

root@localhost (none)>SHOW CREATE DATABASE t1;
+----------+-------------------------------------------------------------+
| Database | Create Database                                             |
+----------+-------------------------------------------------------------+
| t1       | CREATE DATABASE `t1` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
1 row in set (0.00 sec)

你可能感兴趣的:(mysql,后端)