Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

A tabela não pode ter chave primária de 2 campos com auto_increment


Minha sugestão é, crie o genérico id coluna com auto_increment primeiro, para ter uma chave primária na tabela. Em seguida, crie uma chave exclusiva para recipeId e stepNumber juntos para que você não tenha nenhuma combinação duplicada desses 2 campos.

Para poder adicionar várias etapas para uma única receita, você precisará garantir que nenhuma das recipeId , stepNumber ou instruction está definido para incremento automático. A única coluna definida como auto_increment permanece id .

Assim, o esquema da tabela para essas 2 tabelas seria semelhante (ignore a category coluna)
CREATE TABLE `recipies` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL DEFAULT '',
  `category` enum('Salad','Dessert','Meat','Pastry') DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `instructions` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `recipeId` int(11) unsigned NOT NULL,
  `stepNumber` int(11) NOT NULL DEFAULT '1',
  `instruction` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `recipeId` (`recipeId`,`stepNumber`),
  CONSTRAINT `instructions_ibfk_1` FOREIGN KEY (`recipeId`) REFERENCES `recipies` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Vamos adicionar um registro no recipies mesa primeiro
INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');

Então vamos adicionar uma linha
INSERT INTO `instructions` (`recipeId`,`instruction`,`stepNumber`)
SELECT
    1,
    'You will need plenty of pumpkins!',
    IFNULL(MAX(`stepNumber`),0)+1
FROM `instructions`
WHERE `recipeId`=1
  • 1 após SELECT e 1 em WHERE condição ambos se referem à linha com id=1 nas recipies tabela
  • IFNULL(MAX(stepNumber),0)+1 selecionará o número de etapa mais alto para essa receita (se não existir, selecionará "0") +1

Aqui está um violino SQL se você quiser vê-lo funcionando.

[EDITAR]
Eu nunca precisei usar um combo para a chave primária, mas aparentemente seguindo funciona no InnoDB, desde que você ainda não tenha uma chave primária na tabela.
ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)