插入具有唯一索引的重复数据

时间:2015-09-05 15:59:55

标签: mysql

我有一个名为users的表,其中包含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验证了所有这些列在这两种方法中都具有唯一索引。

1 个答案:

答案 0 :(得分:3)

Akash,在第一个 package com.crawler.c_api.rest; import com.crawler.c_api.provider.ResponseCorsFilter; import java.util.logging.Logger; import org.glassfish.jersey.filter.LoggingFilter; import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.server.ServerProperties; public class ApplicationResource extends ResourceConfig { private static final Logger LOGGER = null; public ApplicationResource() { System.out.println("iansdiansdasdasd"); // Register resources and providers using package-scanning. packages("main.java.com.crawler.c_api"); // Register my custom provider - not needed if it's in my.package. register(ResponseCorsFilter.class); // Register an instance of LoggingFilter. register(new LoggingFilter(LOGGER, true)); // Enable Tracing support. property(ServerProperties.TRACING, "ALL"); } } 中,复合(组合)是唯一的。如果您希望它们是唯一的,请将它们分成......单独的UNIQUE键语句,如第二个。

让我们说你的第一张桌子的底部是这个

create table

然后,复合索引中存在的这两行没有任何问题:

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