2014-02-12 2 views
0

Возможно ли использовать имя схемы как внешний ключ таблицы в PostgreSQL? Что-то вроде:Использовать имя схемы как внешний ключ в таблице PostgreSQL

create table account(
    id varchar(30) references information_schema.schemata(schema_name) 
); 

Runnig в SQL выше, я получаю следующее сообщение об ошибке:

SQL Error: 

ERROR: referenced relation "schemata" is not a table 

In block: 

create table account(
    id varchar(30) references information_schema.schemata(schema_name) 
); 

Идея заключается в том, чтобы проверить, если схема учетной записи существует, прежде чем создать учетную запись.

+2

Насколько я знаю, вы не можете ссылаться на * любую * системную таблицу в внешнем ключе (и, кроме того: все в 'information_schema' - это представление, вы никак не можете ссылаться на это) –

+0

@a_horse_with_no_name, Спасибо за ваш отзыв! Пожалуйста, разместите его как ответ, возможно, он будет лучшим. –

+0

Вы можете создать нечто вроде внешнего ключа с триггером ограничения, но он будет намного медленнее, чем фактический FK. –

ответ

3

Вы можете только создавать ссылки FK для конкретных таблиц - не просмотр, как information_schema.schemata:

regress=> \dv information_schema.schemata 
       List of relations 
     Schema  | Name | Type | Owner 
--------------------+----------+------+---------- 
information_schema | schemata | view | postgres 
(1 row) 

Базового pg_catalog.pg_namespace таблицы, которая поддерживает мнение:

regress=> select pg_get_viewdef('information_schema.schemata'); 
              pg_get_viewdef            
----------------------------------------------------------------------------------------------------- 
    SELECT (current_database())::information_schema.sql_identifier AS catalog_name,     + 
    (n.nspname)::information_schema.sql_identifier AS schema_name,         + 
    (u.rolname)::information_schema.sql_identifier AS schema_owner,        + 
    (NULL::character varying)::information_schema.sql_identifier AS default_character_set_catalog, + 
    (NULL::character varying)::information_schema.sql_identifier AS default_character_set_schema, + 
    (NULL::character varying)::information_schema.sql_identifier AS default_character_set_name, + 
    (NULL::character varying)::information_schema.character_data AS sql_path      + 
    FROM pg_namespace n,                   + 
    pg_authid u                     + 
    WHERE ((n.nspowner = u.oid) AND pg_has_role(n.nspowner, 'USAGE'::text)); 
(1 row) 

regress=> \dt pg_catalog.pg_namespace 
       List of relations 
    Schema |  Name  | Type | Owner 
------------+--------------+-------+---------- 
pg_catalog | pg_namespace | table | postgres 
(1 row) 

... тоже не юридическая цель для внешнего ключа, поскольку PostgreSQL не поддерживает ссылки на внешние ключи к системным таблицам:

regress=> CREATE TABLE blah (x text references pg_catalog.pg_namespace(nspname)); 
ERROR: permission denied: "pg_namespace" is a system catalog 

Итак ... вы не можете.

+0

Очень ясно ваше объяснение, спасибо! Как вы думаете, хорошая идея создать триггер, чтобы проверить это? –

+0

@MarcioSimao Конечно, но вы можете создавать только одну сторону, так как вы не можете создавать триггеры на системных таблицах. Таким образом, вы не можете запретить сброс схемы, если вы ссылаетесь на нее, только предотвратите создание строки, которая ссылается на несуществующую схему. –

 Смежные вопросы

  • Нет связанных вопросов^_^