Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tabela nie może mieć 2-polowego klucza podstawowego z funkcją auto_increment

Moja sugestia brzmi:utwórz ogólny id kolumna z auto_increment jako pierwsza, aby mieć klucz podstawowy w tabeli. Następnie utwórz unikalny klucz dla obu recipeId i stepNumber razem, więc nie będziesz mieć zduplikowanej kombinacji tych 2 pól.

Aby móc dodać wiele kroków dla jednego przepisu, musisz upewnić się, że żaden z recipeId , stepNumber lub instruction jest ustawiony na automatyczne zwiększanie. Jedyna kolumna ustawiona na auto_increment pozostaje id .

Tak więc schemat tabeli dla tych 2 tabel będzie wyglądał następująco (zignoruj ​​category kolumna)

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;

Dodajmy rekord w recipies najpierw tabela

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

Następnie dodajmy wiersz

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 po SELECT i 1 w WHERE warunek oba odnoszą się do wiersza z id=1 w recipies stół
  • IFNULL(MAX(stepNumber),0)+1 wybierze najwyższy numer kroku dla tego przepisu (jeśli nie istnieje, wybierze „0”) +1

Oto skrzypce SQL jeśli chcesz zobaczyć, jak działa.

[EDYTUJ]
Nigdy nie musiałem używać kombinacji dla klucza podstawowego, ale najwyraźniej następujące prace na InnoDB pod warunkiem, że nie masz już klucza podstawowego w tabeli.

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. Czy jest to bezpieczna metoda wstawiania danych formularza do bazy danych MySQL?

  2. Tworzenie tabel i problemy z kluczem podstawowym w Rails

  3. Dialekt SQL nie jest skonfigurowany (Phpstorm)

  4. Nie można połączyć się zdalnie z instalacją EC2 MySQL

  5. MySQL Wybierz identyfikator od do i wyklucz początkowy i końcowy identyfikator