【问题标题】:MySQL error: Duplicate key on write or updateMySQL错误:写入或更新时重复键
【发布时间】:2016-04-23 14:45:45
【问题描述】:

我一直在使用 MySQL 设计一个数据库,当编译成 SQL 代码并执行它时会产生两个错误。一个声明Variable 'unique checks' can't be set to the value of 'NULL' 和另一个产生消息"Duplicate key on write and update" 我感觉是我的外键导致了这个问题,但仍然无法解决问题。我附上了下面的查询代码。

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;

-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`User`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`User` ;

CREATE TABLE IF NOT EXISTS `mydb`.`User` (
  `idUser` INT NOT NULL,
  `first_name` VARCHAR(45) NULL,
  `last_name` VARCHAR(45) NULL,
  `username` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  `company_pin` VARCHAR(45) NULL,
  `student_pin` VARCHAR(45) NULL,
  `isAdmin` TINYINT(1) NULL DEFAULT 0,
  `isCandidate` TINYINT(1) NULL,
  `isVoter` TINYINT(1) NULL,
  `votes_left` INT NULL,
  `votes_achieved` INT NULL,
  PRIMARY KEY (`idUser`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Issue`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Issue` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Issue` (
  `idIssue` INT NOT NULL,
  `issueTitle` VARCHAR(45) NULL,
  `issueDescription` VARCHAR(255) NULL,
  `userID` INT NULL,
  `isResolved` TINYINT(1) NULL DEFAULT 0,
  `upVotes` INT NULL,
  PRIMARY KEY (`idIssue`),
  INDEX `FK_USERID_idx` (`userID` ASC),
  CONSTRAINT `FK_USERID`
    FOREIGN KEY (`userID`)
    REFERENCES `mydb`.`User` (`idUser`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Forum`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Forum` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Forum` (
  `idForum` INT NOT NULL,
  `userID` INT NULL,
  `postTitle` VARCHAR(45) NULL,
  `postText` VARCHAR(255) NULL,
  `upVotes` INT NULL,
  PRIMARY KEY (`idForum`),
  INDEX `FK_USERID_idx` (`userID` ASC),
  CONSTRAINT `FK_USERID`
    FOREIGN KEY (`userID`)
    REFERENCES `mydb`.`User` (`idUser`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`Vote`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Vote` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Vote` (
  `idVote` INT NOT NULL,
  `voteFor` ENUM('TOPIC', 'USER', 'ISSUE') NULL,
  `topicID` INT NULL,
  `userID` INT NULL,
  `issueID` INT NULL,
  PRIMARY KEY (`idVote`),
  INDEX `FK_USER_VOTED_FOR_idx` (`userID` ASC),
  INDEX `FK_ISSUE_VOTED_FOR_idx` (`issueID` ASC),
  INDEX `FK_FORUM_VOTED_FOR_idx` (`topicID` ASC),
  CONSTRAINT `FK_USER_VOTED_FOR`
    FOREIGN KEY (`userID`)
    REFERENCES `mydb`.`User` (`idUser`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `FK_ISSUE_VOTED_FOR`
    FOREIGN KEY (`issueID`)
    REFERENCES `mydb`.`Issue` (`idIssue`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `FK_FORUM_VOTED_FOR`
    FOREIGN KEY (`topicID`)
    REFERENCES `mydb`.`Forum` (`idForum`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

【问题讨论】:

    标签: mysql sql mysql-workbench


    【解决方案1】:

    您已经在表mydb.issue 上有一个名为FK_USERID 的约束。给mydb.Forum 上的约束取另一个名字。例如

    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
    
    -- -----------------------------------------------------
    -- Schema mydb
    -- -----------------------------------------------------
    DROP SCHEMA IF EXISTS `mydb` ;
    
    -- -----------------------------------------------------
    -- Schema mydb
    -- -----------------------------------------------------
    CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
    USE `mydb` ;
    
    -- -----------------------------------------------------
    -- Table `mydb`.`User`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`User` ;
    
    CREATE TABLE IF NOT EXISTS `mydb`.`User` (
      `idUser` INT NOT NULL,
      `first_name` VARCHAR(45) NULL,
      `last_name` VARCHAR(45) NULL,
      `username` VARCHAR(45) NULL,
      `password` VARCHAR(45) NULL,
      `company_pin` VARCHAR(45) NULL,
      `student_pin` VARCHAR(45) NULL,
      `isAdmin` TINYINT(1) NULL DEFAULT 0,
      `isCandidate` TINYINT(1) NULL,
      `isVoter` TINYINT(1) NULL,
      `votes_left` INT NULL,
      `votes_achieved` INT NULL,
      PRIMARY KEY (`idUser`))
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Issue`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Issue` ;
    
    CREATE TABLE IF NOT EXISTS `mydb`.`Issue` (
      `idIssue` INT NOT NULL,
      `issueTitle` VARCHAR(45) NULL,
      `issueDescription` VARCHAR(255) NULL,
      `userID` INT NULL,
      `isResolved` TINYINT(1) NULL DEFAULT 0,
      `upVotes` INT NULL,
      PRIMARY KEY (`idIssue`),
      INDEX `FK_USERID_idx` (`userID` ASC),
      CONSTRAINT `FK_USERID`
        FOREIGN KEY (`userID`)
        REFERENCES `mydb`.`User` (`idUser`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Forum`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Forum` ;
    
    CREATE TABLE IF NOT EXISTS `mydb`.`Forum` (
      `idForum` INT NOT NULL,
      `userID` INT NULL,
      `postTitle` VARCHAR(45) NULL,
      `postText` VARCHAR(255) NULL,
      `upVotes` INT NULL,
      PRIMARY KEY (`idForum`),
      INDEX `FK_USERID_idx` (`userID` ASC),
      CONSTRAINT `FK_Forum_USERID`
        FOREIGN KEY (`userID`)
        REFERENCES `mydb`.`User` (`idUser`)
        ON DELETE CASCADE
        ON UPDATE CASCADE)
    ENGINE = InnoDB;
    
    
    -- -----------------------------------------------------
    -- Table `mydb`.`Vote`
    -- -----------------------------------------------------
    DROP TABLE IF EXISTS `mydb`.`Vote` ;
    
    CREATE TABLE IF NOT EXISTS `mydb`.`Vote` (
      `idVote` INT NOT NULL,
      `voteFor` ENUM('TOPIC', 'USER', 'ISSUE') NULL,
      `topicID` INT NULL,
      `userID` INT NULL,
      `issueID` INT NULL,
      PRIMARY KEY (`idVote`),
      INDEX `FK_USER_VOTED_FOR_idx` (`userID` ASC),
      INDEX `FK_ISSUE_VOTED_FOR_idx` (`issueID` ASC),
      INDEX `FK_FORUM_VOTED_FOR_idx` (`topicID` ASC),
      CONSTRAINT `FK_USER_VOTED_FOR`
        FOREIGN KEY (`userID`)
        REFERENCES `mydb`.`User` (`idUser`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `FK_ISSUE_VOTED_FOR`
        FOREIGN KEY (`issueID`)
        REFERENCES `mydb`.`Issue` (`idIssue`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
      CONSTRAINT `FK_FORUM_VOTED_FOR`
        FOREIGN KEY (`topicID`)
        REFERENCES `mydb`.`Forum` (`idForum`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
    
    
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
    

    【讨论】:

      【解决方案2】:

      我在恢复数据库时遇到此错误,我发现以下详细信息:

      当您的表/数据库名称与两侧同一个表/数据库中使用的小/大写字母名称不同时,就会出现此问题(需要在两侧保持相同的名称)区分大小写)。

      【讨论】:

        猜你喜欢
        • 2018-07-04
        • 1970-01-01
        • 2013-12-29
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-21
        相关资源
        最近更新 更多