タグ付けされた質問 「foreign-key」

RDBMSプラットフォームで使用される整合性制約の一種で、列の値が別のテーブルのキー値の範囲の1つと確実に一致するようにします。

2
UPDATE CASCADEを使用したFK制約によって操作が発生した場合、FOR EACH STATEMENTトリガーはどのくらいの頻度で実行されますか?
で定義されたテーブルtのトリガーは、FOR EACH STATEMENTを実行すると1回実行されることを理解していますUPDATE t ...。 では、をtで定義しFOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE、でN行を更新aすると、トリガーが1回呼び出されるのですか、それともN回呼び出されるのですか? 別の言い方をすると、FK制約によってカスケードされたテーブルへの変更は、単一のUPDATE、または一連のUPDATEのようなものですか?

3
参照するすべての外部キーへの主キー更新のカスケード
それを参照するすべての外部キー間で更新をカスケードして主キー列の値を更新することは可能ですか? #編集1: followinqクエリを実行すると select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') 、update_referential_actionが0に設定されていることがわかります。したがって、主キー列を更新した後は何も行われません。外部キーを更新してCASCADE UPDATEでそれらを作成するにはどうすればよいですか? #EDIT 2: スキーマ内のすべての外部キーの作成または削除をスクリプト化するには、次のスクリプトを実行します(ここから取得) DECLARE @schema_name sysname; DECLARE @table_name sysname; DECLARE @constraint_name sysname; DECLARE @constraint_object_id int; DECLARE @referenced_object_name sysname; DECLARE @is_disabled bit; DECLARE @is_not_for_replication bit; DECLARE @is_not_trusted bit; DECLARE @delete_referential_action tinyint; DECLARE @update_referential_action tinyint; DECLARE @tsql nvarchar(4000); DECLARE @tsql2 nvarchar(4000); …

2
推移的な外部キーを追加する必要がありますか?
簡単な例:顧客のテーブルがあります。 create table Customers ( id integer, constraint CustomersPK primary key (id) ) データベース内の他のすべてのデータはにリンクする必要があるCustomerため、たとえばOrders次のようになります。 create table Orders ( id integer, customer integer, constraint OrdersPK primary key (customer, id), constraint OrdersFKCustomers foreign key (customer) references Customers (id) ) 次のようにリンクするテーブルがあるとしますOrders。 create table Items ( id integer, customer integer, order integer, constraint ItemsPK …

1
同じテーブルの2つの行を関連付ける方法
行を相互に関連付けることができるテーブルがあり、論理的には、その関係は2つの行の間で双方向(基本的に、方向がない)になります。(そして、もし疑問に思っているなら、はい、これは実際には1つのテーブルでなければなりません。これは、まったく同じ論理エンティティ/タイプの2つのものです。)これを表す方法はいくつか考えられます。 関係とその逆を保存する リレーションシップを1つの方法で保存し、データベースに逆方向の保存を制限し、FKの順序が逆の2つのインデックスを作成します(1つのインデックスはPKインデックスです)。 2つのインデックスを使用して関係を一方向に保存し、いずれにしても2番目のインデックスを挿入できるようにします(ややこしいですが、ちょっと、完全性) ある種のグループ化テーブルを作成し、元のテーブルにFKを適用します。(多くの質問が発生します。グループ化テーブルには数しかありません。なぜテーブルさえ持っているのですか?FKをNULL可能にするか、単一の行が関連付けられたグループがあるのですか?) これらの方法の主な長所と短所は何ですか?もちろん、私が考えていない方法はありますか? 以下は、使用するSQLFiddle です:http ://sqlfiddle.com/#!12/7ee1a/1/0 。(私が使用しているため、PostgreSQLであるように思われますが、この質問はPostgreSQLに固有のものではないと思います。)現在、例として、関係とその逆の両方を保存しています。

3
既存の外部キーに基づいて結合条件を直感的にするデータベースエンジンはありますか?
外部キーを定義したときに、エンジンがこの情報を使用して正しいJOIN式を自動的に把握できず、代わりに同じ句を再入力する必要があるのは不思議に思えます。既存の外部キーを検査するデータベース、ある種の研究プロジェクトはありますか?

2
mysqlで外部キーにRESTRICTを使用する方法
のデータベース構造 CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

4
外部キー制約を含む列を既存のテーブルに追加する方法は?
次の表があります。 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); messagesテーブルをどのように変更しますか? という新しい列senderが追加されます テーブルをsender参照する外部キーはどこusersですか これはうまくいきませんでした # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist このステートメントは列も作成しませんか?

5
SQL Serverの同じ列での複数の外部キーの使用
SQL Serverでは、列に複数の外部キーを作成できます。異なる名前を使用するたびに、同じオブジェクトを参照する別のキーを作成できます。基本的に、すべてのキーは同じ関係を定義しています。同じ列で定義され、別のテーブルの同じ列を参照する複数の外部キーを使用する方法を知りたい。SQL Serverがそのようなことを可能にすることの利点は何ですか?

3
SQLで1対0または1の関係を実装する
1対0または1(1-0..1)の関係が存在するシナリオ用のデータベースを設計しているとしましょう。例えば: ユーザーのセットがあり、一部の ユーザーは顧客である場合もあります。 したがって、対応する2つのテーブル、usersおよびを作成しましたcustomersが、… …特定のSQLプラットフォームでこの状況を表現して実装する最良の方法は何ですか?私は2つの可能な解決策を検討しました: でusersテーブル、追加customerのFOREIGN KEY参照のいずれであってもよく、列customersまたはNULLマーク。 customersテーブルに、テーブルを指すuser列(UNIQUE制約付きで設定)を含めusersます。 すでにいくつかのフォーラムで同様の質問をしましたが、答えは基本的に「必要なものは何でも」「便利だと思うものは何でも」でした。このような答えは好きではありません。代わりに、DB理論の真面目な部分が必要です。1-0..1の関係についてどこで確認できますか?

2
複合外部キーに別の一意制約が必要なのはなぜですか?
以下は、レコードが同じテーブル内の親レコードを参照できる単純なテーブルです。 CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); 他のフィールド値(num)の1つが親レコードと子レコードの間で同一でなければならないという追加の要件により、複合外部キーでうまくいくと思いました。最後の行を FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) となったエラー:参照された表「foo」というのキーを与えられた一意の制約マッチングはありません。 この制約は簡単に追加できますが、参照される列(id)の1つが既に一意であることが保証されているのに、なぜ必要なのかわかりません。私の見たところ、新しい制約は冗長になります。

1
Amazon RDS PostgreSQLで外部キーを一時的に無効にする方法は?
既存のテスト環境をAmazon RDS PostgreSQLに移行しています。テストフレームワークには、特定のテーブルのデータを以前の状態にリロードする機能があります。このため、外部キーを無効にし、既存のデータを削除し、保存状態をロードして、外部キーを再度有効にします。 現在、テストフレームワークはすべてのトリガーを無効にすることで外部キーを無効にします(もちろん、これにはスーパーユーザーが必要です)。 alter table tablename disable trigger all; RDSでは、これは失敗します。 エラー:拒否された権限:「RI_ConstraintTrigger_a_20164」はシステムトリガーです Amazon RDS PostgreSQLで外部キーを一時的に無効にするにはどうすればよいですか? 注:同様の質問がすでに尋ねられています(RDS上のPostgreSQL:FK制約を使用してデータを一括インポートする方法は?)

1
「2つのテーブルから離れた」制約の適用
SQLで電気回路図をモデリングするときに問題が発生しました。キャプチャしたい構造は part ←────────── pin ↑ ↑ part_inst ←───── pin_inst ここで、「inst」は「instance」の略です。 例えば、私のように持っているかもしれないpartとのLM358オペアンプpinの1OUT、1IN-、1IN +、GND、2IN +、2IN-、2OUT、およびV CC。次に、このパーツを回路図に配置して、a part_instと8を 作成しpin_instます。 データフィールドを無視して、スキーマでの最初の試みは create table parts ( part_id bigserial primary key ); create table pins ( pin_id bigserial primary key, part_id bigint not null references parts ); create table part_insts ( part_inst_id bigserial primary key, part_id …

2
ビューには独自の外部キー制約が必要ですか?
免責事項:私はDBAではなくプログラマーなので、我慢してください... 2つのエンティティを一緒にマッピングするために使用するビューがあります。それを取得するには、いくつかの異なるテーブル間で結合を行う必要があります。 CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS ( SELECT SG.SCREENING_GROUP_ID, V.SITE_ID FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD WHERE VD.VISIT_ID = V.VISIT_ID AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID); 上記は説明用です。あまり気にしないでください。私が知る必要があるのは、新しいV_SCREENING_GROUP_SITESビューのフィールド(SCREENING_GROUP_IDおよびSITE_ID)を、SCREENING_GROUPおよびSITEテーブルへの外部キーとして動作させる方法です。それとも問題ですか? それがテーブルだったとしたら、 ALTER TABLE V_SCREENING_GROUP_SITES ADD CONSTRAINT FK_SCREENING_GROUP_ID FOREIGN KEY (SCREENING_GROUP_ID) REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID; ... しかし、それは明らかに機能しないビューなので、FKを設定するために機能するALTER VIEW構文が見つかりませんでした。私は何をすべきか? (これはMySQLデータベースです)

1
一括挿入後に外部キーが信頼できなくなる
2012互換モードのデータベースを備えたSQL 2014エディションサーバー(12.0.2430.0-SP1はまだありません)(2014に切り替えられるように取り組んでいます...)not trustedデータベースのように一貫してマークされている少数の外部キーオブジェクトがあります。私はそれらをドロップしてNOCHECKオプションなしで再作成しましたが、5〜10分以内に再び信頼できなくなり、CREATEスクリプトを生成すると次のようになります。 ALTER TABLE [dbo].[Points] WITH NOCHECK ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO 使用されている作成スクリプトは次のとおりです。 ALTER TABLE [dbo].[Points] ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId] GO レプリケーションはなく、サードパーティのツールもありません。データベース上のすべてのDDLステートメントを監視しているため、別のユーザーではありません。 私は制約を細かくチェックできます(WITH CHECK CHECKそれぞれで使用)が、その後すぐに信頼できなくなります。実行される保守ジョブのみが午前AMのOlaであり、これは1日中行われます。 更新: したがって、可能性を絞り込むためにいくつかのトレースを行った後、それBULK INSERTが原因でFKが信頼されなくなる可能性があります。このmsdnの質問は、これがキーが信頼されなくなるための有効なルートであることを示しています。これは私が聞いた最初のルートです。 だから私の質問は、BULK INSERT外部キーのis_trustedステータスを維持できる使用する代替戦略はありますか?1時間に数回実行されるアプリケーションのコンテキストで実行されています。代わりに、開発者に挿入ステートメントをバッチ処理させることもできますが、BULK INSERT必要がない場合は、最終通告を使用しないようにします。

2
外部キーの参照インデックスを変更する
私はこのようなものを持っています: CREATE TABLE T1 ( Id INT ... ,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id] ) CREATE TABLE T2 ( .... ,T1_Id INT NOT NULL ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id) ) パフォーマンス(およびデッドロック)の理由で、T1に新しいインデックスを作成しました CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id) しかし、どのインデックスがFKを参照しているかを確認すると、クラスター化インデックスを引き続き参照します。 select ix.index_id, ix.name as index_name, ix.type_desc as index_type_desc, …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.