2017-06-05 3 views
0

最後の数日間、私はmysqliの2列の範囲を一意にする方法を探していました。たとえば、column1は値2を持ち、column2は値6を持ちます。ユーザーが列3,4,5のいずれかに別の行として入力しようとすると、エラーを返す必要があります。私はすべての行をチェックするPHPでそれを行うことができますが、あまりにも多くのレコードがperfomanceを遅くなります。2列のMysqliユニークな範囲

私のシナリオでは、Fromデータ(Unixタイムスタンプに格納)とTillデータ(Unixタイムスタンプに再度格納)があります。

28/06/2017 - 03/07/2017または12/06/2017-19/06/2017が有効である間、例えばこれら2つの日付の間

1497913200(20/06/2017)1498518000(27/06/2017)

何でも、

例えば22/06/2017-29/06/2017または18/06/2017-26/06/2017

無効にする必要があります。

私はあなたがポイントを得ると思うが、私は必要に応じて詳述することができます。

私は明らかにユニークな複数の列を作成する方法を知っていますが、これらの列の範囲はわかりません。それは私が苦労している部分です。

大変助かりました。

+0

参照してください:(HTTPS [なぜ私は非常に単純なSQLクエリであることを私には思える何のためにMCVEを提供する必要があります?] ://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query) – Strawberry

+0

私はまだテーブルを持っていない。なぜなら、これの背後にあるロジックを最初にやりたいからだ。間違った道を歩きたくないから。私が持っている唯一の「実際の」データまたはサンプルデータは、上記で提供されたものです。 – Eilleen

+0

OK、ここから始めるよりも悪いことはありません。(たとえ私が自分のことを言っても;-))... https://stackoverflow.com/questions/30434839/mysql-insert-date-range-into-date-columns -if-dates-dont-overlap-with-existing/30437434#30437434 – Strawberry

答えて

0

私は例えば、あなたがこのチェックを実行するためにTRIGGERを記述する必要があると考えている:

CREATE TRIGGER date_check_trigger BEFORE INSERT ON `table` FOR EACH ROW 
BEGIN 
    SET @EXISTING_RECORD_COUNT = (SELECT COUNT(*) FROM `table` WHERE NEW.date BETWEEN start_date AND end_date) 
    IF (@EXISTING_RECORD_COUNT > 0) THEN 
     SIGNAL SQLSTATE '45000' set message_text='Invalid date, a range already exists'; 
    END IF; 
END 
+0

挿入時のユーザー入力を防止しますか?またはその後? – Eilleen

+0

はい、そうです。エラーメッセージが表示され、ユーザーはレコードを挿入できません。 –

+0

私があなたのシナリオに調整が必要だが、私はまだ受け入れられた答えとしてマークしないので、何をしようとしているのかを取得する – Eilleen