Biorąc pod uwagę nazwę tabeli, w jaki sposób wyodrębnić listę kolumn klucza podstawowego i ich typy danych z funkcji plpgsql?Jak uzyskać klucz podstawowy (podstawowe) tabeli z PostgreSQL za pośrednictwem plpgsql?
Odpowiedz
Zapytanie powyżej jest bardzo zła, ponieważ jest bardzo powolny.
Polecam tę oficjalną wersję:
http://wiki.postgresql.org/wiki/Retrieve_primary_key_columns
jeśli jest potrzebny schemat kwerenda jest następujący
SELECT
pg_attribute.attname,
format_type(pg_attribute.atttypid, pg_attribute.atttypmod)
FROM pg_index, pg_class, pg_attribute, pg_namespace
WHERE
pg_class.oid = 'foo'::regclass AND
indrelid = pg_class.oid AND
nspname = 'public' AND
pg_class.relnamespace = pg_namespace.oid AND
pg_attribute.attrelid = pg_class.oid AND
pg_attribute.attnum = any(pg_index.indkey)
AND indisprimary
Spójrz na tabelę systemową pg_constraint
. Lub information_schema.table_constraints
, jeśli wolisz trzymać się blisko standardu SQL.
Aby uzyskać pełny przykład, połącz się z bazą danych za pomocą psql
za pomocą opcji "-E" i wpisz \d <some_table>
- zobaczysz rzeczywiste zapytania używane do opisu tabeli.
Dodatkowo połącz to z danymi z pg_indexes, a powinieneś być całkiem niezły. Naprawdę klucz podstawowy jest po prostu unikatowym indeksem z niezerową wartością we wszystkich polach. –
Aby zapewnić prostą nieco SQL, można wymienić kolumny klucza podstawowego i ich typy z:
SELECT
c.column_name, c.data_type
FROM
information_schema.table_constraints tc
JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name)
JOIN information_schema.columns AS c ON c.table_schema = tc.constraint_schema AND tc.table_name = c.table_name AND ccu.column_name = c.column_name
where constraint_type = 'PRIMARY KEY' and tc.table_name = 'mytable';
Po uruchomieniu tego na moim serwerze Postgres otrzymuję pusty zestaw wyników. Zanim zapytasz, zastąpiłem ''mytable'' poprawną nazwą tabeli. Czy muszę działać w określonym kontekście lub zakresie? – 2mac
Strzeż indeksów, gdzie kolejność kolumn różni się od celu kolumnie tabeli. (tj. jeśli klucz podstawowy użył kolumn 3, 2 i 1)
Poniższe zapytanie jest znacznie bardziej złożone, ale zwraca kolumny w odpowiedniej kolejności. (Usunąć 'indisprimary klauzulę aby uzyskać te same informacje dla wszystkich indeksów na stole)
WITH ndx_list AS
(
SELECT pg_index.indexrelid
FROM pg_index, pg_class
WHERE pg_class.relname = 'test_indices_table'
AND pg_class.oid = pg_index.indrelid
AND pg_index.indisprimary
), ndx_cols AS
(
SELECT pg_class.relname AS index_name, UNNEST(i.indkey) AS col_ndx, i.indisunique, i.indisprimary
FROM pg_class, pg_index i
WHERE pg_class.oid = i.indexrelid
AND pg_class.oid IN (SELECT indexrelid FROM ndx_list)
)
SELECT ndx_cols.index_name, ndx_cols.indisunique, ndx_cols.indisprimary,
a.attname, format_type(a.atttypid, a.atttypmod), a.attnum
FROM pg_class c, pg_attribute a
JOIN ndx_cols ON (a.attnum = ndx_cols.col_ndx)
WHERE c.oid = 'test_indices_table'::regclass
AND a.attrelid = c.oid
Zachowując kolejność kolumn przy użyciu generate_subscripts
:
SELECT
a.attname,
format_type(a.atttypid, a.atttypmod)
FROM
pg_attribute a
JOIN (SELECT *, GENERATE_SUBSCRIPTS(indkey, 1) AS indkey_subscript FROM pg_index) AS i
ON
i.indisprimary
AND i.indrelid = a.attrelid
AND a.attnum = i.indkey[i.indkey_subscript]
WHERE
a.attrelid = 'your_table'::regclass
ORDER BY
i.indkey_subscript
Poniższe SQL
sprawozdania pracuje dla mnie:
SELECT a.attname
FROM pg_index i
JOIN pg_attribute a ON a.attrelid = i.indrelid
AND a.attnum = ANY(i.indkey)
WHERE i.indrelid = 'tablename'::regclass
AND i.indisprimary;
Jest on pobierany bezpośrednio z here.
- 1. Podstawowy klucz złożony PostgreSQL
- 2. Określ klucz podstawowy tabeli za pomocą TSQL
- 3. Dodaj klucz podstawowy do tabeli PostgreSQL tylko, jeśli nie istnieje
- 4. Jak znaleźć określony klucz obcy tabeli za pośrednictwem T-SQL?
- 5. Podstawowy klucz złożony w django
- 6. Jak dodać złożony klucz podstawowy do tabeli
- 7. SQL Server: Zdobądź klucz podstawowy tabeli za pomocą kwerendy SQL
- 8. Jak uzyskać klucz podstawowy dowolnej jednostki JPA?
- 9. jak kropla nienazwany klucz podstawowy
- 10. Dodaj klucz podstawowy do istniejącej tabeli
- 11. Jak tabeli MySQL automatycznego przyrostu klucz podstawowy z niektórych prefiks
- 12. Związek klucz podstawowy w tabeli typu zmienna
- 13. Klucz podstawowy bez indeksu w tabeli?
- 14. Jak uzyskać typy zakresów PostgreSQL za pośrednictwem jdbc
- 15. MERGE Naruszenie klucz podstawowy
- 16. Usuń klucz podstawowy w MySQL
- 17. Oracle złożony klucz podstawowy/klucz obcego pytania
- 18. Jak zaktualizować klucz podstawowy z Entity Framework?
- 19. JPA kompozytowa klucz podstawowy
- 20. Wspólny klucz podstawowy JPA z wartością pustą
- 21. jak dodać klucz podstawowy do tabeli w szynach
- 22. MySQL: Jak ustawić klucz podstawowy na phpMyAdmin?
- 23. Jak mogę uzyskać nazwę tabeli w funkcji wyzwalacza PostgreSQL?
- 24. Czy klucz obcy może działać jako klucz podstawowy?
- 25. SQL Server 2008: Dowiedz się klucz podstawowy/zagraniczny w tabeli?
- 26. Jak ręcznie ustawić klucz podstawowy w Doctrine2
- 27. Jak zdefiniować złożony klucz podstawowy w SQL?
- 28. Zmień klucz podstawowy z nieklastrowany do Klastra
- 29. Szyny - Zastąp klucz podstawowy has_one
- 30. Podstawowy klucz kontra kluczowego
Jestem prawie pewien, że nie musisz dołączać do pg_namespace. Oid klasy pg_class jest unikatowy, więc kiedy rzucisz go do reglasu, już sugerujesz nazwę schematu. Jeśli potrzebujesz nazwy schematu, po prostu umieść ją w nazwie tabeli: "public.foo" :: regclass. –
"Powyższe zapytanie jest bardzo złe, ponieważ jest naprawdę powolne." Unikaj odwoływania się do względnej pozycji na stronie innych odpowiedzi, ponieważ zmienia się ona wraz z upływem czasu i wybraną metodą sortowania. Zamiast tego najbardziej przyszłościowym sposobem odniesienia się do innej odpowiedzi jest link do niej. – faintsignal