代码改变世界

MySQL--外键的变种

2019-06-23 20:15  风e逸  阅读(117)  评论(0)    收藏  举报

1.唯一索引  

  create table t1(
  id int ....,
  num int,
  xx int,
  unique 唯一索引名称 (列名,列名),
  constraint ....
  )

  唯一索引可以标记多列,即多列不能同时重复,被称作联合唯一索引,以下情况是可以的(第一列为自增,二三列为唯一索引)

	# 
		1   1   1
		2   1   2
		

  

PS:
  唯一:
  约束不能重复(可以为空)

  加速查找
PS:

  主键

  不能重复(不能为空)
  加速查找

 

2.外键的变种

  外键表示为一种约束关系,即一个表中某一列的值,只能是另一个表中某列已有的值,不存在的值不可使用,但是,可以重复。

  外键的定义:constraint fk_abc(外键名) foreign key (自己表中的外键列) references table1(引用表的外键列) //table1 是被引用的表

create table userinfo(
			uid int auto_increment primary key,
			name varchar(32),
			department_id int,
			xx_id int,
			constraint fk_user_depar foreign key (department_id) references color(id)
		)engine=innodb default charset=utf8;
		
		create table department(
			id bigint auto_increment primary key,
			title char(15)
		)engine=innodb default charset=utf8;

  

  那么如果不想重复时,如何制定约束关系呢?

  这时通常采用外键+唯一索引的方式进行指定。

create table userinfo1(
					id int auto_increment primary key,
					name char(10),
					gender char(10),
					email varchar(64)
				)engine=innodb default charset=utf8;

				create table admin(
					id int not null auto_increment primary key,
					username varchar(64) not null,
					password VARCHAR(64) not null,
					user_id int not null,
					unique uq_u1 (user_id),
					CONSTRAINT fk_admin_u1 FOREIGN key (user_id) REFERENCES userinfo1(id)
				)engine=innodb default charset=utf8;
此种情况可以称为一对一

  那么接下来多对多的情况。

create table userinfo2(
					id int auto_increment primary key,
					name char(10),
					gender char(10),
					email varchar(64)
				)engine=innodb default charset=utf8;

				create table host(
					id int auto_increment primary key,
					hostname char(64)
				)engine=innodb default charset=utf8;


				create table user2host(
					id int auto_increment primary key,
					userid int not null,
					hostid int not null,
					unique uq_user_host (userid,hostid),
					CONSTRAINT fk_u2h_user FOREIGN key (userid) REFERENCES userinfo2(id),
					CONSTRAINT fk_u2h_host FOREIGN key (hostid) REFERENCES host(id)
				)engine=innodb default charset=utf8;