约束:1,保证数据的完整性和一致性
2,分为表级约束(不止一个字段)和列级约束(某一个字段)
3,约束类型包括:
NOT NULL(非空约束)
PRIMARY KEY(主键约束)
UNIQUE KEY(唯一约束)
DEFAULT(默认约束)
FOREIGN KEY(外键约束)
外键约束(FOREIGN KEY):保持数据一致性、完整性;实现一对一或一对多关系
外键约束的要求:满足所有条件才能实现外键约束
1,父表(子表所参照的表)和子表(有外键约束的表)必须使用相同的存储引擎,而且禁止使用临时表
2,数据表的存储引擎只能为 InnoDB
my.ini中default-storage-engine=InnoDB
改变的方法还有:ALTER TABLE table_name ENGINE=INNODB;
3,外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同;而字符长度可以不同
4,外键列和参照列必须创建索引。如果外键列(即子表上的列)不存在索引的话,MySQL将自动创建索引(因为父表上的列已经有了)
(参照列(即父表上的列)没有索引的话会自动创建(因为是主键),不是主键的话就需要我们自己来了)
(设置主键的时候会自动创建索引)(若是父表参照列没有索引的话是不能创建成功的)
SHOW INDEXES FROM provinceG;//查看索引是否创建
SHOW INDEXES FROM usersG;
查看创建的表的情况:SHOW CREATE TABLESG;//会看到创建时的输入语句,引擎是否为INNODB也能看到
CREATE TABLE province( //G可以改变显示格式
id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
pname VARCHAR(20) NOT NULL
);
CREATE TABLE usres(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,pid SMALLINT UNSIGNED,FOREIGN KEY (pid) REFERENCES province (id));
CREATE TABLE t1(id SMALLINT UNSIGNED,name char(20));
CREATE TABLE t2(id SMALLINT UNSIGNED,pid SMALLINT UNSIGNED,FOREIGN KEY (pid) REFERENCES t1 (id) ON DELETE CASCADE);
insert t1 values(,'');
外键约束的参照操作:在创建外键之后,子表是否也要进行相应操作。。。。。实际应用中我们很少使用foreign key这种语句(物理外键),因为必须要有innodb支持,myisam等不能用
实际中,我们是使用逻辑外键,即在定义表的时候即根据不同表之间的某种内在逻辑联系进行设置字段名等。。
1,CASCADE:从父表删除或者更新且自动删除或者更新字表中匹配的行ON DELETE CASCADE加载foreign key语句之后
2,SET NULL:从父表删除或更新行,并设置字表中的外键列为NULL。如果使用该选项
,必须保证字表列中没有指定NOT NULL
3,ESTRICT:拒绝对父表的删除或者更新操作。
4,NO ACTION:标准SQL的关键字,在MySQL中与RESTRICT相同
按功能划分
按列数划分
表级(多个列,只能在列定义时声明,很少用到)约束与列级(1个列,之前之后声明都可以)约束:
NOT NULL,DEFAULT只有列级约束
针对字段
修改数据表-添加/删除列
添加单列:ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
//省略了位置指定,则将被放在最下面
添加多列:ALTER TABLE tbl_name ADD [COLUMN] (col_name column_definition,...)//不能指定位置
删除列:ALTER TABLE tbl_name DROP [COLUMN] col_name
多项操作同时进行:ALTER TABLE tbl_name DROP col_name1,DROP col_name2,ADD col_name3 column_definition
针对约束
修改数据表--添加约束:
主键约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type](index_col_name,...)
CONSTRAINT,是约束的意思,后边的symbol是约束名,约束也是有名字的,index_col_name是需要的主键名
index_type,索引的类型,索引有哈希,B-tree,现在默认的都是B-tree
唯一约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] UNIQUE KEY [index_type](index_col_name,...)
外键约束:ALTER TABLE tbl_name ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)[reference_definition]
默认约束:ALTER TABLE tbl_name ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
修改数据表--删除约束
主键约束:ALTER TABLE tbl_name DROP PRIMARY KEY//任何一张表只有一个主键约束,所以不用加字段名
唯一约束:ALTER TABLE tbl_name DROP [INDEX|KEY] index_name
外键约束:ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol//可以用SHOW CREATE TABLE tbl_name查看外键名字
针对表
修改数据表--修改列定义和更名数据表
修改列定义:ALTER TABLE tbl_name MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]//大类型改成小类型可能会造成数据的丢失
修改列名称:ALTER TABLE tbl_name CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]
修改数据表名称:ALTER TABLE tbl_name RENAME [TO|AS] new_tbl_name
RENAME TABLE tbl_name TO new_tbl_name[, tbl_name2 TO new_tbl_name2] ...
不要随意更改数据列或者表的名字