前言
這個其實很常見吧,經常我們會使用主鍵作為唯一限制,如果是手機使用者,或者是郵箱使用者進行登入,那麼這個登入的字段并不是主鍵。在高并發,注冊的時候,如果不設定唯一限制,則可能會導入兩個相同的資料。為了防止這種情況發生,我們要注意添加限制。
1、建立限制和問題引出
1.1、建立聯合限制,我們發現,這裡設定為唯一限制,建立唯一限制和唯一索引又什麼差別?建立唯一限制的時候,也會自動的建立唯一索引。建立唯一索引可以說是唯一限制的一種手段。
DROP TABLE user_info ;
create table user_info(
id BIGINT(20) not null auto_increment,
fuWuBusinessNoId BIGINT(20) default null,
dingYueBusinessNoId BIGINT(20) default null,
openId varchar(20) DEFAULT NULL UNIQUE ,
iphone varchar(20) default null COMMENT '',
status int(11) default null ,
cdate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
udate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY unique_fuWuBusinessNoId_iphone (fuWuBusinessNoId,iphone) COMMENT '服務号和手機号唯一辨別一個使用者,可用于手機号登入判斷',
PRIMARY key (id));
添加普通索引
ALTER TABLE user_info add name VARCHAR(20) DEFAULT NULL ;
CREATE INDEX index_name on user_info(name) ;
添加唯一索引
ALTER TABLE user_info add mail VARCHAR(20) DEFAULT NULL ;
CREATE UNIQUE INDEX index_mail on user_info(mail) ;
1.2、檢視索引 ,
發現其實unique直接建立之後就變成了索引
show INDEX from user_info ;
mysql> show INDEX from user_info ;
+-----------+------------+--------------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+--------------------------------------------------------------------------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+--------------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+--------------------------------------------------------------------------------+
| user_info | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | |
| user_info | 0 | openId | 1 | openId | A | 0 | NULL | NULL | YES | BTREE | | |
| user_info | 0 | unique_fuWuBusinessNoId_iphone | 1 | fuWuBusinessNoId | A | 0 | NULL | NULL | YES | BTREE | | 服務号和手機号唯一辨別一個使用者,可用于手機号登入判斷 |
| user_info | 0 | unique_fuWuBusinessNoId_iphone | 2 | iphone | A | 0 | NULL | NULL | YES | BTREE | | 服務号和手機号唯一辨別一個使用者,可用于手機号登入判斷 |
| user_info | 0 | index_mail | 1 | mail | A | 0 | NULL | NULL | YES | BTREE | | |
| user_info | 1 | index_name | 1 | name | A | 0 | NULL | NULL | YES | BTREE | | |
+-----------+------------+--------------------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+--------------------------------------------------------------------------------+
6 rows in set (0.00 sec)
2、建立和删除限制
alter table test_table add unique key `kk_uq` ( kk);
删除唯一限制(和删除索引一個意思)
ALTER TABLE jw_role DROP INDEX resource_name;
3、springboog注解
@Table(name = "user_info",uniqueConstraints =
{@UniqueConstraint(columnNames = "openId"),
@UniqueConstraint(columnNames = {"fuId","iphone"})})
@Entity
@Accessors(chain = true)
@Data
@NoArgsConstructor
@ApiModel(description = "微信使用者資訊")
public class UserInfo {