因此,尽管我已经添加了唯一的约束,但mySQL数据库仍然接受重复的条目。我一直试图寻找类似的问题,但找不到任何相关的问题。我不知道我的预备语句是错误的还是我的SQL数据库设置错误。这是我的代码:
Connection con = DB.getConnection();
PreparedStatement ps = null, ps1 = null, ps2 = null, ps3 = null, ps4 = null;
ResultSet rs = null;
try {
ps = con.prepareStatement("insert into users(user_id, username, password, email, phone_number,"
+ "name, fb_id, bio) values (DEFAULT, ?, ?, ?, ?, ?, ?, ?)");
ps.setString(1, username);
ps.setString(2, hashedPassword);
ps.setString(3, email_address);
ps.setString(4, phone_number);
ps.setString(5, name);
ps.setString(6, fb_id);
ps.setString(7, bio);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
ps.close();
con.close();
} catch (Exception e) {
e.printStackTrace(); }
我的表格包含以下列:
我使用phpmyadmin和用户名创建了表格,fb_id正确地给了我MySQLIntegrityConstraintViolationException,但是电子邮件和phone_number在插入重复条目时没有给我任何错误。有什么理由会发生这种情况吗?我很遗憾为什么没有强制执行唯一约束......
PS。第一次发帖!
编辑:以下是SHOW CREATE TABLE用户的结果:
CREATE TABLE users (
user_id int(11) NOT NULL AUTO_INCREMENT,
username varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
password varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
email varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
phone_number varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
name varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
fb_id varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
bio text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
PRIMARY KEY (user_id),
UNIQUE KEY username (username,email,phone_number),
UNIQUE KEY fb_id (fb_id)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1
答案 0 :(得分:1)
您目前将UNIQUE KEY设置为复合键。
UNIQUE KEY username (username,email,phone_number)
这意味着用户名,电子邮件和电话号码的组合必须是唯一的。它没有指定每个列不能包含重复值。
为此,您应该根据需要单独向这些列添加UNIQUE INDEX
。例如,要将电子邮件字段设为UNIQUE INDEX
:
ALTER TABLE users ADD UNIQUE INDEX(email);