web-dev-qa-db-ja.com

複雑なキー制約:uuidが新しいか、別の列が一致する場合にのみ許可

私のユースケースでは、このようなものをAzure Data Factory(ADF)で動作させようとしています

しかし、理論的な観点からこの質問にも興味があります。 postgresのような通常のSQLエンジンでこのようなことをすることは可能ですか?

このキー(non_unique_id、timestamp)に基づく挿入を禁止します。ここで、timestampはそのペアの一意の値です。

例えば:

挿入するデータ:

non_unique_id: 0cf6c19c14
timestamp: 1970-01-01 00:00:01

ケース1許可

挿入前:

select non_unique_id, timestamp from tbl where non_unique_id = 0cf6c19c14;

0 results

ケース2許可

挿入前:

select non_unique_id, timestamp from tbl where non_unique_id = 0cf6c19c14;

0cf6c19c14, 1970-01-01 00:00:01
0cf6c19c14, 1970-01-01 00:00:01
0cf6c19c14, 1970-01-01 00:00:01
...

ケース3は許可されていません

挿入前:

select non_unique_id, timestamp from tbl where non_unique_id = 0cf6c19c14;

0cf6c19c14, 2038-01-19 03:14:05
0cf6c19c14, 2038-01-19 03:14:05
0cf6c19c14, 2038-01-19 03:14:05
...

もちろん他の列もありますが、これは最も単純なケースを示しています

3
jaksco

タイムスタンプはnon_unique_idに機能的に依存しているため、これは正規化の問題です。

したがって、主キーnon_unique_idと対応するタイムスタンプを持つ別のテーブルが必要です。

SQL Server/Azure SQLデータベースでは、できますがこれを インデックス付きビュー で強制できます。

スキーマのバインドと定義を含むビューを作成する

SELECT non_unique_id,
       timestamp,
       COUNT_BIG(non_unique_id) AS Count
FROM   dbo.YourTable
GROUP  BY non_unique_id,
          timestamp 

次に、一意のクラスター化インデックスをビューの列non_unique_idに配置します。

5
Martin Smith