2016-03-21 7 views
1

更新するたびに何千もの行を追加するテーブルがあります。各行は、単一項目の現在の値を示します。MySQLの複数の列に対して一意制約のキーとしてタイムパンを指定するにはどうすればよいですか?

ある時間間隔、たとえば1時間の間、特定のItemIDに対して1つの挿入を許可する制約を追加したいとします。言い換えれば

私は私のテーブルの一意性制約も私のテーブルに「ITEMID」「タイムスパン」を1列にしたいと思います。

は、だから、私は何とかこのような何かを追加するだろうと思った:

BETWEEN DATE_ADD(NOW(),INTERVAL -1 HOUR) AND NOW() AS timespan 

私は私のテーブル変更(「ITEMID」は、私のテーブルでちょうど列無関係である」)

ALTER TABLE `items_update` ADD UNIQUE `unique_timespan`(`itemID`, `timespan`); 

これを行うことができますか、またはこれをチェックするネストされたINSERTクエリを作成する必要がありますか?

+0

私はあなたの解決策が間違っていると確信していますが、より多くのコンテキストを提供する必要があります。何をしようとしているのですか、itemIdは何ですか、あなたのスキーマはどのように見えますか? – wvdz

+0

もちろん私のコードは間違っていることがわかります。 itemIDは何でもかまいません。それは私のテーブルの単なる列です。問題は「タイムスパン」です。 マルチカラム制約のユニークな部分がタイムパンであることがわかりました。 – Sprazer

+1

私たちの靴に身を置こうとすると、あなたは何をしているのか分かりません。あなたがしようとしていることに関する文脈を提供する。たとえば、「itemIDが同じ行を頻繁に挿入しないようにしたい」という理由は明確ではありません。または、あなたは 'BETWEEN ...'コードを – wvdz

答えて

1

1つの時間間隔、たとえば1時間あたり1つのItemIDです。切り捨てられたタイムスタンプを使用してこれを行うことができます。 UNIX_TIMESTAMPは「1-1,1970年以降の秒数」を返します。 (60 * 60)で整数除算を行うと、「1-1,1970年以降の時間」が得られます。これは、あなたの制約のために使用することができます。

INSERT INTO myTable (ItemId, timespan) 
VALUES (1, FLOOR(UNIX_TIMESTAMP()/60/60)); 

ALTER TABLE myTable ADD CONSTRAINT UNIQUE (ItemId, timespan); 

このソリューションは非常に柔軟性があり、それは簡単にあなたが望む任意の時間間隔を使用することができ、35メートルまたは1日1時間1分を言います。

制約内で切り捨てることもできますが、これは大きなデータセットでパフォーマンスの問題を引き起こす可能性があります。

ALTER TABLE myTable ADD CONSTRAINT UNIQUE (ItemId, FLOOR(updatedTime/60/60)); 
+0

完璧な、これは私が探していた解決策でした。 最も素晴らしい解決策は、ソリューションの魔法使いが余分な列を必要としないことでした。しかし、これは、ありがとう! – Sprazer

+0

タイムスタンプを既に保存している場合は、新しい列を追加する必要がないソリューションを追加しました。 – wvdz

+0

すごい!それは正確に私が探していたクエリでした! – Sprazer

関連する問題