sql >> Base de Datos >  >> RDS >> Mysql

La tabla no puede tener una clave principal de 2 campos con auto_increment

Mi sugerencia es crear el id genérico columna con auto_increment primero, para tener una clave principal en la tabla. Luego cree una clave única para ambos recipeId y stepNumber juntos para que no tenga ninguna combinación duplicada de estos 2 campos.

Para poder agregar varios pasos para una sola receta, deberá asegurarse de que ninguno de recipeId , stepNumber o instruction está configurado para incrementarse automáticamente. La única columna establecida en auto_increment sigue siendo id .

Entonces, el esquema de tabla para estas 2 tablas se vería así (ignore la category columna)

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;

Agreguemos un registro en las recipies mesa primero

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

Entonces agreguemos una fila

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 después de SELECT y 1 en el WHERE ambas condiciones se refieren a la fila con id=1 en las recipies mesa
  • IFNULL(MAX(stepNumber),0)+1 seleccionará el número de paso más alto para esa receta (si no existe, seleccionará "0") +1

Aquí hay un SQL fiddle si quieres verlo funcionar.

[EDITAR]
Nunca necesité usar un combo para la clave principal, pero aparentemente lo siguiente funciona en InnoDB siempre que no tenga una clave principal en la tabla.

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