sql >> Database teknologi >  >> RDS >> PostgreSQL

Skift PostgreSQL-kolonner, der bruges i visninger

Permanent løsning for denne sag

For at undgå problemet helt, brug datatypen text eller varchar / character varying uden en længdeangivelse i stedet for character varying(n) . Læs om disse datatyper i manualen.

CREATE TABLE monkey(name text NOT NULL)

Hvis du virkelig ønsker at håndhæve en maksimal længde, skal du oprette en CHECK begrænsning :

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

Du kan til enhver tid ændre eller droppe denne begrænsning uden at røre ved afhængige objekter som f.eks. visninger og uden at tvinge Postgres til at skrive nye rækker i tabellen på grund af ændringen af ​​type (hvilket ikke altid er nødvendigt mere i moderne version af Postgres).

Detaljeret forklaring

Som foreslået af @Michael tilføjer jeg nogle mere generelle oplysninger:

En visning i PostgreSQL er ikke bare et "alias til underforespørgsel". Visninger er implementeret som specielle tabeller med en regel ON SELECT TO my_view DO INSTEAD . (Det er derfor, du kan ændre visninger med en ALTER TABLE kommando.) Du kan GRANT privilegier til det, tilføje kommentarer eller endda definere kolonnestandarder (nyttigt for en regel ON INSERT TO my_view DO INSTEAD... ). Læs mere i manualen her eller her.

Hvis du ændrer underliggende objekter, skal du også ændre den definerende forespørgsel for enhver afhængig visning. ALTER VIEW sætning kan kun ændre hjælpeattributter for en visning. Brug CREATE OR REPLACE VIEW for at ændre forespørgslen - det vil bevare eventuelle yderligere attributter.

Men hvis du ønsker at ændre datatyper for resulterende kolonner (som i det foreliggende tilfælde), CREATE OR REPLACE VIEW er ikke muligt. Du skal DROP den gamle og CREATE et nyt syn. Dette vil aldrig slette nogen data fra de underliggende tabeller. Det vil slip dog eventuelle yderligere attributter i visningen, som også skal genskabes.




  1. Sådan finder du datoformatet, der bruges i den aktuelle session i SQL Server (T-SQL)

  2. Minimering af virkningen af ​​at udvide en IDENTITY-søjle – del 2

  3. Returner månedens start i SQLite

  4. Hvordan kan jeg få antallet af poster påvirket af en lagret procedure?