2015-09-05 84 views
1

我有一个表称为具有4个唯一列的用户,当我插入数据在email它不会给我任何错误,并插入数据,即使当该列中已存在相同的值。插入重复的数据与唯一索引

这里是我的数据库结构:

$user = "CREATE TABLE IF NOT EXISTS users(
id INT UNSIGNED AUTO_INCREMENT, 
fb_id BIGINT UNSIGNED NULL, 
google_id BIGINT UNSIGNED NULL, 
fname VARCHAR(255) NOT NULL, 
lname VARCHAR(255) NULL, 
email VARCHAR(320) NOT NULL, 
username VARCHAR(20) NULL, 
password VARCHAR(255) NULL, 
access_token TEXT NULL, 
type ENUM('facebook','google','site') NOT NULL, 
gender ENUM('m','f','o') NULL, 
reg_date DATE NOT NULL, 
token_expire DATETIME NULL, 
PRIMARY KEY(id), 
UNIQUE(email,username,fb_id,google_id) 
)"; 

但是,当我创建我的结构如下表:

$user = "CREATE TABLE IF NOT EXISTS users(
id INT UNSIGNED AUTO_INCREMENT, 
fb_id BIGINT UNSIGNED NULL UNIQUE, 
google_id BIGINT UNSIGNED NULL UNIQUE, 
fname VARCHAR(255) NOT NULL, 
lname VARCHAR(255) NULL, 
email VARCHAR(320) NOT NULL UNIQUE, 
username VARCHAR(20) NULL UNIQUE, 
password VARCHAR(255) NULL, 
access_token TEXT NULL, 
type ENUM('facebook','google','site') NOT NULL, 
gender ENUM('m','f','o') NULL, 
reg_date DATE NOT NULL, 
token_expire DATETIME NULL, 
PRIMARY KEY(id) 
)"; 

它给了我一个错误时,有一个重复的条目。

使用这些方法中的任何一种创建表不会产生任何错误。在创建表格后,我使用phpmyadmin验证了所有这些列在两种方法中都有唯一的索引。

+0

'UNIQUE(电子邮件,用户名,fb_id ,google_id)'不会使**每一个**都是唯一的,而是**它们的组合**。这意味着如果其他3个值中的任何值不同,则可以根据需要多次插入相同的电子邮件。 –

回答

3

Akash,在第一个create table中,组合(组合)是唯一的。如果你希望它们单独是独一无二的,将它们分开......独立的UNIQUE键语句,就像第二个一样。

比方说,你的第一个表的底部阅读本

PRIMARY KEY(id), 
UNIQUE KEY(email,username,fb_id,google_id) 

再有什么不对现有的综合指数这两行:

'[email protected]','Akash',101,102 

and 

'[email protected]','Akash2',101,102 
+0

你能通过复合组合找到什么? –

+0

跨越所有复合列的独特组合,是更清晰还是模糊? – Drew

相关问题