Mysql
 sql >> Database >  >> RDS >> Mysql

La tabella non può avere una chiave primaria a 2 campi con auto_increment

Il mio suggerimento è di creare l'id generico colonna con auto_increment prima, per avere una chiave primaria nella tabella. Quindi crea una chiave univoca per entrambi recipeId e stepNumber insieme in modo da non avere alcuna combinazione duplicata di questi 2 campi.

Per poter aggiungere più passaggi per una singola ricetta dovrai assicurarti che nessuno di recipeId , stepNumber o instruction è impostato per l'incremento automatico. L'unica colonna impostata su auto_increment rimane id .

Quindi lo schema della tabella per queste 2 tabelle sarebbe simile (ignora la category colonna)

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;

Aggiungiamo un record nelle recipies prima la tabella

INSERT INTO `recipies` (`name`,`category`)
VALUES ('Pumpkin Pie','Pastry');

Quindi aggiungiamo una riga

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 dopo SELECT e 1 nel WHERE entrambe le condizioni si riferiscono alla riga con id=1 nelle recipies tabella
  • IFNULL(MAX(stepNumber),0)+1 selezionerà il numero di passaggio più alto per quella ricetta (se non esiste selezionerà "0") +1

Ecco un fiddle SQL se vuoi vederlo funzionare.

[MODIFICA]
Non ho mai avuto bisogno di usare una combinazione per la chiave primaria, ma apparentemente seguendo i lavori su InnoDB a condizione che tu non abbia già una chiave primaria nella tabella.

ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)