尽管有唯一约束,MySQL数据库仍有重复的条

时间:2014-05-27 23:10:54

标签: java mysql duplicates prepared-statement unique

因此,尽管我已经添加了唯一的约束,但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(); }

我的表格包含以下列:

  • user_id int(11)PRIMARY,
  • 用户名varchar(20)UNIQUE,
  • 密码varchar(100),
  • email varchar(30)UNIQUE,
  • phone_number varchar(10)UNIQUE,
  • fb_id varchar(20)UNIQUE,
  • bio FULL TEXT

我使用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

1 个答案:

答案 0 :(得分:1)

您目前将UNIQUE KEY设置为复合键。

UNIQUE KEY username (username,email,phone_number)

这意味着用户名,电子邮件和电话号码的组合必须是唯一的。它没有指定每个列不能包含重复值。

为此,您应该根据需要单独向这些列添加UNIQUE INDEX。例如,要将电子邮件字段设为UNIQUE INDEX

ALTER TABLE users ADD UNIQUE INDEX(email);