2017-02-20 4 views
0

私は2つのテーブルを持っています。表AおよびB表Aには、自動増分を主キーとして持つ列があります。 (I挿入するPHPを使用)テーブルに外部キーとしてdatetime列を持つことは安全ですか?

id name  date_created 
1  Kletian 12-12-12 12:12:12 
2  Vormav  12-12-12 12:12:13 
3  Agrias  12-12-12 12:12:14 
4  Ramza  12-12-12 12:12:15 

表B、表AのIDを参照する外部キーを持つ必要がありますが、IDは(MySQLの生成)自動インクリメントであるので、私は、サーバー側のプログラミングを使用して割り当てることはできません。しかし、表Aには、datetime属性を持つdate_created列があります。

通常、これはテーブルBであるように見えるはずです。

id  images 
1  abc.jpg 
1  def.png 
1  ghi.jpg 
2  jkl.png 
3  mno.jpeg 
3  pqr.png 

と、これは、テーブルBのための私の計画である:

date_created   images 
12-12-12 12:12:12  abc.jpg 
12-12-12 12:12:12  def.png 
12-12-12 12:12:12 
12-12-12 12:12:13 
12-12-12 12:12:14  
12-12-12 12:12:14  pqr.png 

注:

  • が自動インクリメントを取得サーバーサイドプログラミング(PHP)による価値は信頼できません。ユーザーはレコードを削除して注文を混乱させる可能性があるため。
  • 私はテーブル構造を変更する特権を持っています。マイナーな変更は大丈夫ですが、大きな変更は禁止されています。
  • 私のプランは安全ですか、別の選択肢がありますか?
+0

表Bは、表Aの外部キー参照である別の列を持つ必要があります。私は外部キー参照の日時を使用しません。 –

+0

あなたのチームの大きな変化は何ですか?外部キーを設定し、テーブルの索引付けを変更することは小さな変更ですか?表Bに同じ日時を持つ複数の行がデザイン内に存在するでしょうか?また、あなたの最初のメモを取得しないでください。削除すると、どんな順序が乱れますか? – Alfabravo

+0

@Alfabravo no。 1つの日付時刻(date_created)と、文字列/テキストを含む複数の列のみが含まれます。 – ashura91

答えて

0

シーケンス番号:は表に1列を取り、新しいエントリが挿入されたときにインクリメント(ない自動インクリメント)例えば:

seq_no | name 
    1 | Kletian 
    3 | Agrias 

をですから、新しいエントリをしたいときの表に、ちょうどseq_noMAX()を取得し、1

ことによってそれをインクリメントテーブルBでまた

、として、外部キーなどのseq_noを行います。ここでは

seq_no | images 
    1 | abc.jpg 
    3 | efg.jpg 
+0

max()を使用すると、並行性を処理するときに安全ではありません。OPが注文を心配している場合、これはうまくいきません – Alfabravo

+0

よく、私はテーブルで注文を使用します。しかし、それは試してみる価値があるようです。 – ashura91

0

はあなたのテーブルDDL(スキーマ)のためにたいと思うものです:

CREATE TABLE IF NOT EXISTS `table_a` (
    `id`     MEDIUMINT NOT NULL AUTO_INCREMENT, 
    `name`    TEXT  NOT NULL, 
    `created_date`  TIMESTAMP NOT NULL DEFAULT NOW(), 
    PRIMARY KEY (`id`) 
); 

CREATE TABLE IF NOT EXISTS `table_b` (
    `id`     MEDIUMINT NOT NULL AUTO_INCREMENT, 
    `image`    TINYTEXT NOT NULL, 
    `created_date`  TIMESTAMP NOT NULL DEFAULT NOW(), 
    `table_a_id`   MEDIUMINT NOT NULL, 
    PRIMARY KEY (`id`), 
    FOREIGN KEY (`table_a_id`) REFERENCES table_a(id) ON DELETE CASCADE 
); 

表Bは、への外部キー参照を持ちます。表Aです。

これらの変更を行うことができるかどうかはわかりませんが、それが理想的な解決策です。

+0

うーん..私は知らない。多くの変更があるようです。表Aは、表Bよりずっと前に作成されます.1つまたは2つの列を追加すると問題ありません。私は異常があることを恐れる。途中で素晴らしい提案。 – ashura91

+0

@ ashura91大きなことは、すでに作成されているテーブルに外部キーを作成できることです。既に作成されている場合は、テーブルBに別の列を追加するだけです。参照が作成されるまで、行nullを設定できます。 –

関連する問題