sql >> データベース >  >> RDS >> Mysql

テーブルにauto_incrementを持つ2フィールドの主キーを含めることはできません

    私の提案は、一般的なidを作成することです 最初にauto_incrementを持つ列で、テーブルに主キーがあります。次に、両方のrecipeIdに一意のキーを作成します およびstepNumber 一緒に使用すると、これら2つのフィールドの組み合わせが重複することはありません。

    1つのレシピに複数のステップを追加できるようにするには、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
    
    • SELECTの後の1 WHEREに1つ 条件は両方ともid=1の行を参照します recipiesで テーブル
    • IFNULL(MAX(stepNumber),0)+1 そのレシピの最大のステップ番号を選択します(存在しない場合は「0」を選択します)+1

    これがSQLフィドル です。 動作を確認したい場合。

    [編集]
    主キーにコンボを使用する必要はありませんでしたが、テーブルに主キーがない場合は、InnoDBで次のように動作するようです。

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


    1. 日時フィールドしかない場合、月と年でグループ化するにはどうすればよいですか?

    2. アンカーとメンバーに共用体がある再帰クエリ

    3. MicrosoftAccessテンプレートを使用する利点

    4. T-SQLのバグ、落とし穴、およびベストプラクティス–ピボットとピボット解除