2011-07-13 7 views
1

Original Question: Database Design: need composite key + foreign keyDatabase Design: besoin clé composite + partie clé étrangère 2

Voici ce que j'ai besoin:

  • Une valeur incrémentiel automatique pour Id
  • Colonnes a et b à traiter comme une clé composite

SQL:

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL'; 

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; 
USE `mydb` ; 

-- ----------------------------------------------------- 
-- Table `mydb`.`foo` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `mydb`.`foo` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `a` VARCHAR(45) NOT NULL , 
    `b` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `a_UNIQUE` (`a` ASC) , 
    UNIQUE INDEX `b_UNIQUE` (`b` ASC)) 
ENGINE = InnoDB; 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

Cet insert devrait travail parce que les valeurs pour a, b sont différentes:

INSERT INTO `mydb`.`foo` 
    (`id`, `a`, `b`) 
VALUES 
    (NULL, 'hello world', '1'), 
    (NULL, 'hello world', '2') 

Pourquoi pas le travail SQL?

Répondre

3

Vous devez utiliser:

CREATE TABLE IF NOT EXISTS `mydb`.`foo` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `a` VARCHAR(45) NOT NULL , 
    `b` VARCHAR(45) NOT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `a_UNIQUE` (`a` ASC, b ASC) 
ENGINE = InnoDB; 

Votre instruction CREATE TABLE crée des contraintes uniques indépendantes - vous voulez une contrainte composite, comme vous voyez dans ma réponse, pour être en mesure d'avoir des paires étant unique.

Et vous avez seulement besoin de backticks (`) autour de MySQL reserved words pour leur échapper.

Questions connexes