Mysql
 sql >> база данни >  >> RDS >> Mysql

Таблицата не може да има първичен ключ с 2 полета с auto_increment

Моето предложение е да създадете общия id колона с auto_increment първо, за да има първичен ключ в таблицата. След това създайте уникален ключ и за двата recipeId и stepNumber заедно, така че няма да имате дублиращи се комбинации от тези 2 полета.

За да можете да добавите няколко стъпки за една рецепта, ще трябва да се уверите, че нито една от recipeId , stepNumber или instruction е настроен на автоматично нарастване. Единствената колона, зададена на auto_increment, остава id .

Така че схемата на таблицата за тези 2 таблици ще изглежда така (игнорирайте category колона)

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;

Нека добавим запис в recipies таблица първа

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

Тогава нека добавим ред

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 след SELECT и 1 в WHERE и двете условия се отнасят за реда с id=1 в recipies маса
  • IFNULL(MAX(stepNumber),0)+1 ще избере най-високия номер на стъпка за тази рецепта (ако не съществува, ще избере "0") +1

Ето SQL цигулка ако искате да видите как работи.

[РЕДАКТИРАНЕ]
Никога не ми се е налагало да използвам комбинация за първичния ключ, но очевидно следването работи на InnoDB, при условие че вече нямате първичен ключ в таблицата.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. как да изтриете записи от база данни с Ajax

  2. MySQL Изберете последните 7 дни

  3. MySQL агрегатни функции без клауза GROUP BY

  4. SQL масово вмъкване на базата на данни, извлечени от друга таблица

  5. Regex за получаване на регионални и областни кодове от пощенски кодове на Обединеното кралство