PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Безопасно преименувайте таблици, като използвате колони от сериен първичен ключ

serial не е действителен тип данни. Ръководството гласи:

Типовете данни smallserial , serial и bigserial не са истински типове, а просто нотационно удобство за създаване на колони с уникални идентификатори

Псевдо типът данни се разрешава, като прави всичко това:

  • създайте последователност с име tablename_colname_seq

  • създайте колоната с тип integer (или int2 / int8 съответно за smallserial / bigserial )

  • направете колоната NOT NULL DEFAULT nextval('tablename_colname_seq')

  • накарайте колоната да притежава последователността, така че да бъде изхвърлена с нея автоматично

Системата не знайте дали сте направили всичко това на ръка или чрез псевдо тип данни serial . pgAdmin проверява изброените функции и ако всички са изпълнени, обратно проектираният DDL скрипт се опрости със съответстващия serial Тип. Ако една от характеристиките не е изпълнена, това опростяване не се извършва. Това е нещо, което pgAdmin прави. За основните каталожни таблици всичко е същото. Няма serial тип като такъв.

Няма начин автоматично да преименувате притежаваните поредици. Можете да стартирате:

ALTER SEQUENCE ... RENAME TO ...

както направихте. Самата система не се интересува от име . Колоната DEFAULT съхранява OID ('foo_pkey_seq'::regclass ), можете да промените името на последователността, без да го нарушавате - OID остава същият. Същото важи и за външните ключове и подобни препратки в базата данни.

Неявният индекс за първичния ключ е свързан с името на ограничението PK, което не промяна, ако промените името на таблицата. В Postgres 9.2 или по-нова версия можете да използвате

ALTER TABLE ... RENAME CONSTRAINT ..

да коригирам и това.

Може също да има индекси, наречени във връзка с името на таблицата. Подобна процедура:

ALTER INDEX .. RENAME TO  ..

Можете да имате всякакви неформални препратки към името на таблицата. Системата не може насилствено да преименува обекти, които могат да се наименуват както пожелаете. И не го интересува.

Разбира се, не искате да анулирате SQL кода, който препраща към тези имена. Очевидно не искате да променяте имената, докато логиката на приложението ги препраща към тях. Обикновено това не би било проблем за имената на индекси, последователности или ограничения, тъй като те обикновено не се препращат по име.

Postgres също придобива заключване на обекти, преди да ги преименува. Така че, ако има едновременни транзакции отворени, които имат някакъв вид заключване на въпросните обекти, вашето RENAME операцията е в застой, докато тези транзакции не бъдат ангажирани или се върнат назад.

Системни каталози и OID

Схемата на базата данни се съхранява в таблици на системния каталог в системната схема pg_catalog . Всички подробности в ръководството тук. Ако не знаете точно какво правите, въобще не трябва да се забърквате с тези таблици . Едно грешно движение и можете да разбиете вашата база данни. Използвайте DDL командите, които Postgres предоставя.

За някои от най-важните таблици Postgres предоставя типове идентификатори на обекти и прехвърляния на типове, за да получите бързо името на OID и обратно. Като:

SELECT 'foo_pkey_seq'::regclass

Ако името на схемата е в search_path и името на таблицата е уникално, което ви дава същото като:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

Първичният ключ на повечето каталожни таблици е oid и вътрешно повечето препратки използват OID.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL заявката е много бавна с ограничение 1

  2. Как да подготвим изрази и параметри за свързване в Postgresql за C++

  3. gem install pg не може да се свърже с libpq

  4. PostgreSQL е най-добрата база данни в света

  5. PostgreSQL JDBC Null String, взет като байт