- 締切済み
同一のカラム値をもつもの同士の中での連番
こんにちは。 タイトルが上手くまとまっておらず、すみません。 以下のようなことを実現したいと思っております。 カラムc1(INT型)とカラムc2(INT型)をもつテーブルt1があるとします。 「INSERT INTO t1(c1) VALUES(1);」などと実行した場合、自動的にカラムc2が以下のように同一のカラムc1の値同士の中で連番されていくようにするテーブル定義はできないでしょうか。 ↓「SELECT c1, c2 FROM t1 ORDER BY 1 ASC, 2 ASC;」を実行した様子 1,1 1,2 2,1 3,1 3,2 ※ フォントの違いによる形崩れは免れないと思い、CSVのようにカラムの区切りをカンマで、レコードの区切りを改行で表現しています。 言うまでもなく、c1とc2の組は必然的にユニークになります。 ご教授、お願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- yambejp
- ベストアンサー率51% (3827/7415)
別回答があるとおり、やってできないことはありませんが 連番でデータをつける意味はあるのでしょうか? データを削除した場合結局抜け番が発生して連番状態はくずれます。 連番を前提に設計をすると思わぬ落とし穴があるかもしれません。 通常データの投入順をみるだけならauto_incrementされたカラムを みればいいので、c1,c2の組み合わせを取ることは無駄だと思います
- mpro-gram
- ベストアンサー率74% (170/228)
テーブルのエンジンを myisam にしてもよいなら、連動primary key の最も後方に指定したint型カラムについてのみauto_increment にすることができます。前方で指定のカラム値ごとにincrement されます。 create table `rendo` ( a int not null , b int not null auto_increment , n varchar() , primary key (a,b) )engine=myisam; innodb ならprimary key は別に持っておいて、 trigger などで、チェックしてupdateでしょうかね? create table `rendo` ( id int not null primary key auto_increment , a int not null , b int , n varchar() , unique (a,b) )engine=innodb; delimiter # create trigger `rendo_auto` AFTER INSERT ON `rendo` FOR EACH ROW begin set @m = (select max(b)+1 from `rendo` where a=NEW.a) ; update `rendo` set b = @m where id = NEW.id ; end# 未検証なので、insert 対象テーブルでのサブクエリがエラーになるようなら、無理かも?