問題タブ [unique-key]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - INSERT ... ON DUPLICATE KEY (何もしない)
2 つの列に一意のキーを持つテーブルがあります。
そのテーブルに行を挿入したいのですが、キーが存在する場合は何もしません。キーが存在するためにエラーが生成されるのは望ましくありません。
次の構文があることを知っています。
しかし、次のようなものがあります:
?
python - SQLiteの複数の一意の列
3つのフィールドが同じである行を許可しないようにするために必要なテーブルを作成しようとしています。
SQLLiteを使用してPythonでテーブルを作成するときは、次のように使用しますが、ほとんど結果が得られません。通常、2つのレコードを書き込んだ後に停止するため、何かが重複していると明らかに信じています。
したがって、ownerID1、ownerID2、accountKey、およびargID1が同じであるレコードをデータベースで許可しないようにします。
誰かがこれを手伝ってくれる?
ありがとうございました!
objective-c - 配列属性によるコアデータ内のオブジェクトの検索、1万を超える要素でのパフォーマンス
短い:任意のオブジェクト(要素のメンバーシップだけでなく、要素の順序も一意性を決定する)の一意の不変配列(固定長ですが、実行時に選択されます)を保持するキーによってコアデータオブジェクト
を見つける必要があります。ただし、NSManagedObjectはオーバーライドを禁止します。それで? [isEqual:]
ロング:
コアデータモデルにエンティティ(エンティティ「…リンク」の図の画像を参照)があり、属性キー(「タプル」)に基づいて一意性を保証する必要があります。ここまでは順調ですね。
ただし、エンティティの一意の属性はNSArrayである必要があります。
そして、物事をもう少し難しくするために、私はタプルの要素のクラスタイプも知りません。
また、タプルの要素数もわかりません。実際、カウントはすべてのタプルで同じです(少なくともコアデータコンテキストごと)が、アプリが実行される前はわかりません。
特定のタプルを持つリンクエンティティのインスタンスは1つだけでなければなりません。
そして明らかな理由で、任意のオブジェクトの特定の配列を持つタプルインスタンスは1つだけです。一方、が返さ
れる場合、2つのタプルは等しいと見なされます。 NSManagedObjectは、オーバーライドを禁止しますが、それ以外の場合は、物事はかなり簡単になります。[tuple_1 isEqual:tuple_n]
YES
[isEqual:]
[hash]
「…Tuple」オブジェクトは、トークンの配列とともに(便利なメソッドを介して)作成され、不変です(したがって、各「…Token」とそのデータ属性も不変です)。(「…Tuple」を「…Link」の辞書キーと考えてください。)
「 …Tuple」は、「…TokenOrder」の「order」キーに基づいて、きちんと順序付けられたトークンの配列"- (NSArray *)tokens;"
を返すを実装します。(タプルには最大5つの要素が含まれると予想されます。)
ただし、「…Link」オブジェクトは数万(場合によってはさらに多く)あると予想されます。これらのオブジェクトは、「タプル」属性に基づいて(頻繁に)検索する必要があります。
悲しいことに、私はそのようなシナリオの記事(解決策は言うまでもなく)を文献やウェブで見つけることができませんでした。
何か案は?
私がこれまでに思いついた可能な解決策は次のとおりです。
「…Tuple」に「」と呼ばれる別の属性を追加することにより、タプルで比較する要素の数が少なくなります。
tupleHash
これは、オブジェクトの作成時に次の方法で事前に計算されます。スニペット1NSPredicateを使用して、一致するtupleHashのオブジェクトをクエリします(候補のリストをかなり絞り込みます)。
絞り込まれた候補リストで、指定されたタプルを特徴とする「…Link」を検索します。Snippet1
スニペット1:
スニペット2:
(申し訳ありませんが、マークダウンはリストとコードスニペットの混合に反対しているようです。)
良いアイデアですか、それとも非常識ですか?
前もって感謝します!
c++ - 200 個の文字列が与えられた場合、関係値の LUT をキーにする良い方法は何ですか?
200本の弦を持っています。各文字列には、他のすべての文字列との関係 (0 と 1 の間の浮動小数点数で測定) があります。この関係は双方向です。つまり、関係 A/B == 関係 B/A です。これにより、n(n-1)/2、つまり 19,800 の関係が得られます。
私がやりたいのは、これらのリレーションシップをルックアップ テーブルに格納して、任意の 2 つの単語からリレーションシップの値をすばやく見つけられるようにすることです。
私は c++ を使用しているので、おそらく std::map を使用して LUT を保存します。問題は、この目的に使用するのに最適なキーは何かということです。
キーは一意である必要があり、両方の単語からすばやく計算できる必要があります。
私のアプローチは、単語のペアごとに一意の識別子を作成することです。たとえば、"apple" と "orange" という単語が与えられた場合、それらを "appleorange" (アルファベット順、小さい方から) として結合し、それをキー値として使用します。
これは良い解決策ですか、それとももっと賢い方法を提案できますか? :)
java - Hibernate で一意のキーに基づいて検索または挿入する
一意だが主キーではないキーに基づいて Hibernate オブジェクトを返すメソッドを作成しようとしています。エンティティがデータベースに既に存在する場合はそれを返したいのですが、そうでない場合は、新しいインスタンスを作成して保存してから返したいと思います。
更新:これを書いているアプリケーションは、基本的に入力ファイルのバッチプロセッサであることを明確にしましょう。システムは、ファイルを 1 行ずつ読み取り、データベースにレコードを挿入する必要があります。ファイル形式は基本的に、スキーマ内の複数のテーブルの非正規化ビューであるため、親レコードを解析してデータベースに挿入し、新しい合成キーを取得するか、既に存在する場合はそれを選択する必要があります。次に、そのレコードに戻る外部キーを持つ他のテーブルに関連するレコードを追加できます。
これが難しい理由は、各ファイルを完全にインポートするか、まったくインポートしない必要があるためです。つまり、特定のファイルに対して行われるすべての挿入と更新は、1 つのトランザクションの一部である必要があります。すべてのインポートを実行するプロセスが 1 つしかない場合、これは簡単ですが、可能であれば、これを複数のサーバーに分割したいと考えています。これらの制約のため、1 つのトランザクション内にとどまることができる必要がありますが、レコードが既に存在する例外を処理する必要があります。
親レコードのマップされたクラスは次のようになります。
このメソッドを書く最初の試みは次のとおりです。
問題は、探している名前が存在する場合、uniqueResult() の呼び出しによって org.hibernate.AssertionFailure 例外がスローされることです。完全なスタック トレースは以下のとおりです。
この例外がスローされる原因を知っている人はいますか? 休止状態はこれを達成するためのより良い方法をサポートしていますか?
また、最初に挿入してから、それが失敗したかどうか、いつ失敗したかを選択する理由を先制的に説明しましょう。これは分散環境で機能する必要があるため、チェック全体で同期して、レコードが既に存在するかどうかと挿入を確認できません。これを行う最も簡単な方法は、すべての挿入で制約違反をチェックして、データベースにこの同期を処理させることです。
postgresql - PostgreSQL でこの一意の制約を設定できないのはなぜですか?
私は得続けます:
SQL エラー: エラー: 一意のインデックス "service_import_checksum_key" を作成できませんでした 詳細: キー (チェックサム)=() が重複しています。
声明では:
ALTER TABLE "public"."service_import" ADD CONSTRAINT "service_import_checksum_key" UNIQUE ("checksum")
しかし、この制約は重複ではありません。データベース全体のどこにもこのような制約は他にありません。一体なぜそれが重複していると主張し続けるのか、私にはわかりません。これは、ここで見逃しているpostgresの奇妙なニュアンスだと思います。
私は何を間違っていますか?
テーブル ダンプ:
mysql - MyISAM の一意のキーが 64 バイトで切り捨てられ、衝突が発生する
URL を一意のキーとして格納する MySQL テーブルがあります。キー自体が任意の URL の最初の 64 バイト (または必要に応じてラテン 1 照合された文字) にすぎないように見えるため、キーで衝突が発生し始めています。そのため、URL が 64 文字を超えていて、既に同様の URL を取得している場合、エラーがスローされます。
例えば:
このエラーをスローします:
MyISAM の鍵の長さは 1000 バイトであるはずではありませんか?
編集:次のように見える CREATE TABLE STATUS 呼び出しにリストされているプレフィックス長がないようです:
次のように 256 に設定しようとしました。
次のエラーが発生しました。
フォールバックは、MySQL Workbench を介して ALTER TABLE を実行したためだと思います。
php - php/javascript を使用した一意のシリアル番号
php/javascript を使用して、Mac、Windows などのマシンと iPhone、Blackberry などのデバイスに固有のシリアル番号を取得する方法はありますか?
database-design - リレーショナルデータベースでグローバルに一意の識別子を実装する長所/短所と方法?
私の質問の最初の部分に関して: 私は最近、リレーショナル データベース内の特定のテーブルに一意の識別子を持つことの利点とトレードオフは何かを自問していました。例として、Facebook (FB) Graph API を使用すると、同じ URL を使用して「ユーザー」、「イベント」、「ページ」などのさまざまなタイプのオブジェクトをフェッチできます。たとえば、https://domain/251906384206はhttps://domain/195466193802264は「グループ」タイプのオブジェクトを返しますが、タイプ「イベント」のオブジェクト。
https://domain/event/251906384206またはhttps://domain/group/195466193802264のように使用される「一般的でない」API を提供する場合と比較して、このアプローチの利点は何ですか。この場合、各オブジェクト タイプには独自の識別子スコープがあるため、同様の識別子が異なるオブジェクト タイプに使用される可能性があります。
質問の 2 番目の部分について: グローバルに一意の識別子を実装するためのオプションは何ですか?
私の頭に浮かぶ2つのオプションは次のとおりです。
継承ベースのアプローチ (クラスごとのテーブル、単一テーブルなど) の使用。クラスごとのテーブル アプローチが使用されていると仮定すると (スーパー テーブルには一意の識別子が主キーとしてのみ含まれ、オブジェクト タイプを表すサブ テーブルにはスーパー テーブルと同じ識別子と追加のデータが含まれます)、スーパー テーブルとサブ テーブルの間に結合が必要であり、スケールが大きくないように見えます。スーパーテーブルがボトルネックになるから?
以下を含む 3 列のテーブルを提供する
- 一意の識別子、
- オブジェクト タイプ固有の主キー、および
- テーブル名。
一意の識別子を外部キーとして参照する列を含む、オブジェクト タイプごとの追加のテーブル。各オブジェクト タイプ固有のテーブルには、独自の主キー スコープがあります。
どちらのアプローチでも、前述の FB API のような汎用 API を提供できます。2 番目のアプローチでは、オブジェクト テーブル固有の主キーを内部で使用し、グローバルに一意の識別子のみを公開できます。ただし、グローバル一意識別子が内部で使用される可能性がある場合、2 番目の方法でも結合が必要になります。
グローバルに一意の識別子の長所と短所に関する経験はありますか?それを実装するためのベスト プラクティスは何ですか?
mysql - mysqlテーブル全体の一意キー?
AとBの2つの列を持つmysqlテーブルがあるとします。AまたはBのいずれかに1回だけ(テーブル全体で1回)値を挿入できるように、一意のキーを持つことは可能ですか?
したがって、列Aに「qwe」が含まれ、Bに「asd」が含まれている場合、これら2つの値をどちらの列にも挿入できなくなります。
これは機能しません:
ありがとう。
編集:私は次のトリガーでこれを達成することができました:
ただし、「A OR Bはすでに存在します」というエラーメッセージは表示されませんが、次のようになります。
エラー1054(42S22):「where句」に不明な列「存在しません」
再度、感謝します!