1

レシピの命令を表すテーブルを作成しようとしています。

+---------------------+
| recipeId   (PK, FK) |
| stepNumber (PK)     |
|---------------------|
| instruction         |
+---------------------+

アイデアは、テーブルと自動インクリメントから来る(recipeId, stepNumber)場所の主キーを持つことです。recipeIdrecipestepNumber

このテーブルを作成しようとすると、次のエラーが発生しました。

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key 

私がやろうとしていることは正しい/可能ですか?

4

3 に答える 3

3

私の提案は、id最初にauto_incrementを使用して汎用列を作成し、テーブルに主キーを含めることです。次に、これら2つのフィールドの重複した組み合わせがないように、両方recipeIdと一緒に一意のキーを作成します。stepNumber

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

動作を確認したい場合は、SQLフィドルを使用してください。

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

ALTER TABLE `instructions`
ADD PRIMARY KEY(`recipeId`,`stepNumber`)
于 2013-01-20T02:16:48.270 に答える
2

私は尋ねなければなりません-なぜあなたはしたいですか?考えてみると、レシピID(FK)は一意であり、ステップ番号は常に1から始まります(ゼロベースの場合はゼロ)。

- 編集 -

steps table:
recipe_id step_id step_detail
--------- ------- ---------------------------
        1       1 blah
        1       2 blah
        1       3 blah
        2       1 blah
        2       2 blah
        2       3 blah
        2       4 blah
        2       5 blah
--------- ------- ---------------------------

ここに自動インクリメントを含めた場合、次のレシピのために1にリセットするのではなく、ステップ数が増え続けます。

-編集終了-

よろしく、ウェスティ。

于 2013-01-19T23:48:43.093 に答える
1

それがあなたが使用しているものであるならば、私はあなたがInnoDBでこれをすることができるとは思わない。どうやらあなたはMyISAMでできます。

http://dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html

于 2013-01-19T21:24:42.830 に答える