it-swarm-eu.dev

Co se stane, když změníte (zmenšíte) délku sloupce?

Řekněme, že mám dva sloupce typu NUMBER (bez přesnosti a měřítka) a VARCHAR(300). Viděl jsem, že tyto sloupce jsou příliš velké pro moje data, takže je chci upravit na NUMBER(11) a VARCHAR(10). Pokud tedy spustím tento příkaz SQL:

ALTER TABLE FOO
    MODIFY(BAR NUMBER(10));
  • Dokážu to udělat na neprázdném sloupci?
  • Pokud ano, co Pokud existuje jedna hodnota větší než NUMBER(10), řekne mi o tom Oracle?
  • Zůstanou výchozí hodnoty sloupce nezměněny, pokud byly dříve definovány?
  • Zůstane možnost s možností zrušení sloupce nezměněna?
  • Zůstane primární, cizí, jedinečný klíč v tomto sloupci nezměněn?
  • Zůstanou omezení týkající se těchto sloupců nezměněna?
  • Zůstanou indexy v těchto sloupcích nezměněny?

Existuje nějaká oficiální dokumentace, která odpovídá na mé otázky?

10
mnowotka

Oracle Administrators Guide říká následující:

Pomocí příkazu ALTER TABLE ... MODIFY upravte existující definici sloupce. Můžete upravit typ dat sloupce, výchozí hodnotu, omezení sloupce, výraz sloupce (pro virtuální sloupce) a šifrování sloupce.

Pokud stávající data splňují novou délku, můžete zvětšit délku existujícího sloupce nebo jej zmenšit. Můžete změnit sloupec z bajtové sémantiky na sémantiku CHAR nebo naopak. Musíte nastavit inicializační parametr BLANK_TRIMMING = TRUE, abyste zkrátili délku neprázdného sloupce CHAR.

Pokud upravujete tabulku pro zvětšení délky sloupce typu dat CHAR, uvědomte si, že se může jednat o časově náročnou operaci a může vyžadovat značné dodatečné úložiště, zejména pokud tabulka obsahuje mnoho řádků. Důvodem je, že hodnota CHAR v každém řádku musí být prázdná, aby vyhovovala nové délce sloupce.

Oracle SQL Language Reference má mnohem podrobnější informace včetně následujících:

Typ dat libovolného sloupce můžete změnit, pokud všechny řádky sloupce obsahují nuly. Pokud však změníte datový typ sloupce v tabulce kontejnerů materializovaného pohledu, zruší Oracle Database odpovídající materializované zobrazení.

Vždy můžete zvětšit velikost znaku nebo hrubého sloupce nebo přesnost číselného sloupce, ať už všechny řádky obsahují nuly. Velikost datového typu sloupce můžete zmenšit, pokud změna nevyžaduje změnu dat. Databáze prohledává existující data a vrací chybu, pokud existují data, která přesahují nový limit délky.

Sloupec DATE můžete upravit na TIMESTAMP nebo TIMESTAMP S LOCAL TIME ZONE. Libovolný TIMESTAMP S MÍSTNÍM ČASOVÝM ZÓNEM můžete upravit do sloupce DATE.

Pokud je tabulka prázdná, můžete zvýšit nebo snížit úvodní pole nebo zlomkovou sekundu ve sloupci datetime nebo interval. Pokud tabulka není prázdná, můžete zvýšit pouze úvodní pole nebo zlomkovou sekundu sloupce datetime nebo interval.

U sloupců CHAR a VARCHAR2 můžete změnit sémantiku délky zadáním CHAR (k označení sémantiky znaků pro sloupec, který byl původně zadán v bajtech) nebo BYTE (k označení sémantiky bajtů pro sloupec, který byl původně zadán ve znakech). Chcete-li se naučit sémantiku délky existujících sloupců, zeptejte se sloupce CHAR_USED zobrazení datového slovníku ALL_, USER_ nebo DBA_TAB_COLUMNS.

Ve výše uvedené dokumentaci jsou další informace a omezení. Zde je ukázka pokusu snížit přesnost sloupce Number a zkrátit délku Varchar2. Můžete vyzkoušet jiné změny, abyste věděli, co se stane.

--Setup.
DROP TABLE FOO;
CREATE TABLE FOO (BAR Number, BAR2 VARCHAR2(300));
INSERT INTO FOO (SELECT Level, RPAD(to_char(Level),10*Level,to_char(Level)) 
   FROM DUAL CONNECT BY Level <=20);
COMMIT;
SELECT * FROM FOO;

--Reduce Number to Number(10).
ALTER TABLE FOO MODIFY (BAR NUMBER (10));

--Reduce Varchar2(300) to Varchar2(100) (data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100));

--Reduce Varchar2(300) to Varchar2(200) (no data would be truncated).
ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(200));

Příkazy alter mají následující výstup:

ALTER TABLE FOO MODIFY (BAR NUMBER (10))
Error report:
SQL Error: ORA-01440: column to be modified must be empty to decrease precision or scale
01440. 00000 -  "column to be modified must be empty to decrease precision or scale"

ALTER TABLE FOO MODIFY (BAR2 VARCHAR2(100))
Error report:
SQL Error: ORA-01441: cannot decrease column length because some value is too big
01441. 00000 -  "cannot decrease column length because some value is too big"

table FOO altered.

Snižte přesnost vytvořením nového sloupce.

ALTER TABLE FOO ADD (BAR3 NUMBER(10));
UPDATE FOO SET Bar3 = Bar;
ALTER TABLE FOO DROP COLUMN BAR;
ALTER TABLE FOO RENAME COLUMN BAR3 TO BAR;
12
Leigh Riffel