天天看點

Mysql給表添加限制

前言

這個其實很常見吧,經常我們會使用主鍵作為唯一限制,如果是手機使用者,或者是郵箱使用者進行登入,那麼這個登入的字段并不是主鍵。在高并發,注冊的時候,如果不設定唯一限制,則可能會導入兩個相同的資料。為了防止這種情況發生,我們要注意添加限制。

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 {