- ベストアンサー
MySQLで期間のUNIQUEってできますか?
例えばstart_dateとend_dateというカラムを作って start_date~end_dateの期間がuniqueになるように制御できたりするものでしょうか? ex. start_date end_date 2010-10-11 2010-12-31 が入ってた時に 2010-11-12 2010-01-01 ×insertできない 2010-01-01 2010-01-31 ○insertできる
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
SQL92完全準拠のDBMSがあれば CREATE ASSERTION とかで可能かもしれませんが、実装しているDBMSがないので現実上不可能。
その他の回答 (5)
- yambejp
- ベストアンサー率51% (3827/7415)
とてもひどいSQLになったのでこれならきちんとトリガーなどで処理した方がいいかも set @s:='2010-01-01',@e:='2010-01-31'; insert into hoge (start_date,end_date) select start,end from (select @s as start,@e as end) as temp1 inner join (select count(*) from hoge where start_date between @s and @e or @s between start_date and end_date having count(*)=0 ) as temp2 on 1; set @s:='2010-11-12',@e:='2011-01-01'; insert into hoge (start_date,end_date) select start,end from (select @s as start,@e as end) as temp1 inner join (select count(*) from hoge where start_date between @s and @e or @s between start_date and end_date having count(*)=0 ) as temp2 on 1;
お礼
回答ありがとうございます。 やはりさくっとプログラム側で処理した方がいいような(汗) 折角考えてもらったので使えそうな時につかてみます。
- yambejp
- ベストアンサー率51% (3827/7415)
ごめんなさい、なんか全然ちがいます。 再考・・・
- yambejp
- ベストアンサー率51% (3827/7415)
こんな感じでいけませんか? INSERT INTO hoge (start_date,end_date) select (@start:='2010-11-12') , (@end:='2011-01-01') from hoge where start_date BETWEEN @start AND @end OR end_date BETWEEN @start AND @end; INSERT INTO hoge (start_date,end_date) select (@start:='2010-01-01') , (@end:='2010-01-31') from hoge where NOT(start_date BETWEEN @start AND @end) AND NOT(end_date BETWEEN @start AND @end);
- chukenkenkou
- ベストアンサー率43% (833/1926)
もし実装するとすれば、検査制約(CHECK句)やトリガなどを使うことが考えられます。 MySQLでは、 検査制約は他RDBMSとの互換のためだけで、書くことはできるが動作はしない トリガは、MySQL 5.0で実装 です。 MySQL 5.0以降であれば、トリガで実装してみては?
お礼
回答ありがとうございます。 やはり、トリガとかになりますか。 もし私が提案するものがあってサクッと使えるなら使いたかったのですが、さほど頻度も高くないので、今回はプログラム側で処理してしまいます。
- nda23
- ベストアンサー率54% (777/1416)
MySQLに限らずできません。 単一、あるいは複数の項目の値で Uniqueかどうかを判断します。 それも一致か不一致かという区別 だけで、「大きい」とか「小さい」の ような判定はしません。
お礼
回答ありがとうございます。 複合uniqueとかは結構使っているのでもしかしたら…と思ったのですが。 プログラムの方で処理します。
お礼
回答ありがとうございます。 CREATE ASSERTION なんてのは初めて聞きました。 勉強になります…と言っても実装できないですがw