0

次のようなテーブルがあります。

CREATE TABLE test(
id integer not null default nextval('test_id_seq'::regclass),
client_name_id integer not null
);

外部キー制約:

"test_client_name_id_fkey" FOREIGN KEY (client_name_id) REFERENCES company(id) DEFERRABLE INITIALLY DEFERRED

および会社のテーブル:

CREATE TABLE company(
id integer not null default nextval('company_id_seq'::regclass),
company_name character varying(64) not null
)

これで、company_name と一致する文字列である提供された値 client_name_id を使用して、会社のテーブルから ID を取得するテスト テーブルにトリガーが設定されました。しかし、レコードを挿入すると、PostgreSQL は client_name_id が文字列であり、int が必要であるというエラーを返します。これは true です。

トリガーで処理したため、挿入された行を検証しないように PostgreSQL に指示するにはどうすればよいですか。

4

1 に答える 1

2

あなたがやろうとしていることは非常に非正統的です。これでよろしいですか?もちろん、(数字以外の) 文字列を整数列に入力することはできません。驚くことではありませんよね?代わりにテキストを入力する場合は、代わりにテキスト列を追加する必要があります-company(company_name)現在のレイアウトに一致させたい場合は、fk-constraint を使用します。

ALTER TABLE test ALTER DROP COLUMN client_name_id; -- drops fk constraint, too
ALTER TABLE test ADD COLUMN client_name REFERENCES company(company_name);

これを許可するには、上のUNIQUE制約が必要です。company.company_name

ただし、アプローチを再考することをお勧めします。あなたのテーブルレイアウトはそのままで適切に見えます。トリガーは型にはまらない要素です。通常は、現在のように主キーを参照します。トリガーは必要ありません。会社名を取得するには、次のようにテーブルに参加しますSELECT

SELECT *
FROM   test t
JOIN   company c ON t.client_name_id = c.id;

また、これらの非標準修飾子は、必要な場合にのみ存在する必要があります: DEFERRABLE INITIALLY DEFERRED. 同様に、(同じトランザクションで)testテーブルに参照値を入力する前にテーブルに値を入力する必要がある場合。company

于 2012-10-22T01:40:02.317 に答える