プロが教えるわが家の防犯対策術!

例えば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できる

A 回答 (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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/08 18:06

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


再考・・・
    • good
    • 0

こんな感じでいけませんか?



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);
    • good
    • 0

もし実装するとすれば、検査制約(CHECK句)やトリガなどを使うことが考えられます。



MySQLでは、

検査制約は他RDBMSとの互換のためだけで、書くことはできるが動作はしない
トリガは、MySQL 5.0で実装

です。
MySQL 5.0以降であれば、トリガで実装してみては?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/08 14:45

SQL92完全準拠のDBMSがあれば


CREATE ASSERTION とかで可能かもしれませんが、実装しているDBMSがないので現実上不可能。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/08 14:43

MySQLに限らずできません。


単一、あるいは複数の項目の値で
Uniqueかどうかを判断します。
それも一致か不一致かという区別
だけで、「大きい」とか「小さい」の
ような判定はしません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/02/08 14:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!