• ベストアンサー

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できる

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

SQL92完全準拠のDBMSがあれば CREATE ASSERTION とかで可能かもしれませんが、実装しているDBMSがないので現実上不可能。

keeeeeeeen
質問者

お礼

回答ありがとうございます。 CREATE ASSERTION なんてのは初めて聞きました。 勉強になります…と言っても実装できないですがw

その他の回答 (5)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.6

とてもひどい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;

keeeeeeeen
質問者

お礼

回答ありがとうございます。 やはりさくっとプログラム側で処理した方がいいような(汗) 折角考えてもらったので使えそうな時につかてみます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.5

ごめんなさい、なんか全然ちがいます。 再考・・・

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

こんな感じでいけませんか? 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);

回答No.3

もし実装するとすれば、検査制約(CHECK句)やトリガなどを使うことが考えられます。 MySQLでは、 検査制約は他RDBMSとの互換のためだけで、書くことはできるが動作はしない トリガは、MySQL 5.0で実装 です。 MySQL 5.0以降であれば、トリガで実装してみては?

keeeeeeeen
質問者

お礼

回答ありがとうございます。 やはり、トリガとかになりますか。 もし私が提案するものがあってサクッと使えるなら使いたかったのですが、さほど頻度も高くないので、今回はプログラム側で処理してしまいます。

  • nda23
  • ベストアンサー率54% (777/1416)
回答No.1

MySQLに限らずできません。 単一、あるいは複数の項目の値で Uniqueかどうかを判断します。 それも一致か不一致かという区別 だけで、「大きい」とか「小さい」の ような判定はしません。

keeeeeeeen
質問者

お礼

回答ありがとうございます。 複合uniqueとかは結構使っているのでもしかしたら…と思ったのですが。 プログラムの方で処理します。

関連するQ&A