MySQL中你知道幾種防止數(shù)據(jù)重復(fù)的方法?
很多時(shí)候在日常的項(xiàng)目中,有些數(shù)據(jù)是不允許重復(fù)的,例如用戶信息中的登陸名,一旦存在同一個(gè)登陸名,必然不知道到底是哪個(gè)用戶執(zhí)行登陸操作,導(dǎo)致系統(tǒng)異常。
常常在防止數(shù)據(jù)重復(fù)的情況下,我們都采用唯一索引去解決,如下
- CREATE TABLE `login` (
- `id` bigint unsigned NOT NULL AUTO_INCREMENT,
- `name` varchar(255) DEFAULT NULL,
- `password` varchar(255) DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `idx_name` (`name`) USING BTREE
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
當(dāng)我們執(zhí)行同樣的name的數(shù)據(jù)時(shí)則會(huì)報(bào)如下錯(cuò)誤
除了這個(gè)方法,你還知道其他的嗎?
下面我們介紹另外幾種方法
insert ignore into
插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則忽略此次插入
INSERT ignore INTO login(`name`,`password`) VALUES("ganhuojun","password")
replace into
插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則刪除再插入
REPLACE INTO login(`name`,`password`) VALUES("ganhuojun","password")
執(zhí)行后發(fā)現(xiàn),2行生效,其中一行刪除,1行新增
insert if not exists
sql的語(yǔ)法為insert into … select … where not exist ...,該語(yǔ)句先判斷mysql數(shù)據(jù)庫(kù)中是否存在這條數(shù)據(jù),如果不存在,則正常插入,如果存在,則忽略
- INSERT INTO login ( `name`, `password` ) SELECT
- 'ganhuojun',
- 'password'
- FROM
- login
- WHERE
- NOT EXISTS (
- SELECT
- `name`
- FROM
- login
- WHERE
- `name` = 'ganhuojun'
- )
on duplicate key update
插入數(shù)據(jù)時(shí),如果數(shù)據(jù)存在,則執(zhí)行更新操作
- INSERT INTO login ( `name`, `password` )
- VALUES
- ( "ganhuojun", "password" )
- ON DUPLICATE KEY UPDATE PASSWORD = 'passwd'