sql >> Databasteknik >  >> RDS >> PostgreSQL

Ändra PostgreSQL-kolumner som används i vyer

Permanent lösning för det här fallet

För att undvika problemet helt och hållet använd datatypen text eller varchar / character varying utan en längdspecifikator istället för character varying(n) . Läs om dessa datatyper i manualen.

CREATE TABLE monkey(name text NOT NULL)

Om du verkligen vill genomdriva en maximal längd, skapa en CHECK begränsning :

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

Du kan ändra eller släppa den begränsningen när som helst utan att röra beroende objekt som vyer och utan att tvinga Postgres att skriva nya rader i tabellen på grund av ändringen av typ (vilket inte alltid är nödvändigt längre i modern version av Postgres).

Detaljerad förklaring

Som föreslagits av @Michael lägger jag till lite mer allmän information:

En vy i PostgreSQL är inte bara ett "alias till subquery". Vyer implementeras som specialtabeller med en regel ON SELECT TO my_view DO INSTEAD . (Det är därför du kan ändra vyer med en ALTER TABLE kommando.) Du kan GRANT privilegier till det, lägg till kommentarer eller till och med definiera kolumnstandardvärden (användbart för en regel ON INSERT TO my_view DO INSTEAD... ). Läs mer i manualen här eller här.

Om du ändrar underliggande objekt måste du också ändra den definierande frågan för en beroende vy. ALTER VIEW uttalande kan bara ändra extra attribut för en vy. Använd CREATE OR REPLACE VIEW för att ändra frågan - det kommer att bevara eventuella ytterligare attribut.

Men om du vill ändra datatyper för resulterande kolumner (som i det aktuella fallet), CREATE OR REPLACE VIEW är inte möjligt. Du måste DROP den gamla och CREATE en ny syn. Detta kommer aldrig att radera någon data från de underliggande tabellerna. Det kommer släpp dock alla ytterligare attribut i vyn, som också måste återskapas.




  1. Blockera, blockera, blockera på DBAs dörr med SQL Server-blockering

  2. Escapende et-tecken i SQL-sträng

  3. Kontrollera om två val är likvärdiga

  4. Hur lägger man en sträng till ett kolumnvärde i MySQL?