Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tabel tidak boleh memiliki kunci utama 2 bidang dengan peningkatan_otomatis

Saran saya, buat id generik kolom dengan auto_increment terlebih dahulu, untuk memiliki kunci utama dalam tabel. Kemudian buat kunci unik untuk keduanya recipeId dan stepNumber bersama-sama sehingga Anda tidak akan memiliki kombinasi duplikat dari 2 bidang ini.

Agar dapat menambahkan beberapa langkah untuk satu resep, Anda harus memastikan tidak ada recipeId , stepNumber atau instruction diatur ke peningkatan otomatis. Satu-satunya kolom yang disetel ke peningkatan_otomatis tetap id .

Jadi skema tabel untuk 2 tabel ini akan terlihat seperti (abaikan category kolom)

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;

Mari tambahkan catatan di recipies tabel dulu

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

Lalu mari kita tambahkan satu baris

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 setelah SELECT dan 1 di WHERE kondisi keduanya merujuk ke baris dengan id=1 di recipies meja
  • IFNULL(MAX(stepNumber),0)+1 akan memilih nomor langkah tertinggi untuk resep itu (jika tidak ada akan memilih "0") +1

Berikut adalah biola SQL jika Anda ingin melihatnya bekerja.

[EDIT]
Saya tidak pernah perlu menggunakan kombo untuk kunci utama tetapi ternyata mengikuti bekerja di InnoDB asalkan Anda belum memiliki kunci utama dalam tabel.

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. Apakah mungkin untuk mengubah nama tabel mysql dari huruf kecil ke huruf besar di linux?

  2. Sisipkan menggunakan PreparatStatement. Bagaimana cara menambah ID secara otomatis?

  3. Apakah kenaikan otomatis mysql aman digunakan sebagai userID?

  4. mysql SELECT dengan preferensi kondisi

  5. Kesalahan menyetel nilai properti; pengecualian bersarang adalah org.springframework.beans.NotWritablePropertyException: