回答

收藏

修改表以修改列的默认值

技术问答 技术问答 425 人阅读 | 0 人回复 | 2023-09-14

我有一个需要修改数据库表中列默认值的要求。该表已经是数据库中的现有表,并且当前该列的默认值为NULL。现在,如果将新的默认值添加到此列,如果我是正确的话,它将列的所有现有NULL更新为新的DEfault值。有没有一种方法可以不执行此操作,但仍在列上设置新的默认值。我的意思是我不想更新现有的NULL,并希望它们保留为NULL。% q$ S6 s( A8 r3 N# z' L& y% c
在这方面的任何帮助,不胜感激。谢谢
" {) \, e" g1 E2 K" f* e2 @5 h               
) N+ I7 N* Z! K; k1 B- k解决方案:2 L' L. K5 L2 B8 x
               
  @" e* N2 A, ~% h& [" J& ^2 M/ c
5 L0 |( W  a) D% N  y
+ }# r( b  s  _9 }. z                您对将会发生的事情的信念是不正确的。为列设置默认值不会影响表中的现有数据。7 E. u/ Q& a# z4 V4 k; H" O3 R  o
我创建一个表,该表的列col2没有默认值
5 `! n; w: z* t0 {; v9 eSQL> create table foo(
- ]" }* l" n, D  2    col1 number primary key,5 K. m# T1 N! m) k
  3    col2 varchar2(10)' Q- s' f; w: N1 h2 @. V3 [
  4  );
2 B4 P0 b" H6 H2 G5 }" l- ^Table created.
/ d3 z" z  F( t6 T  W) bSQL> insert into foo( col1 ) values (1);& J  C5 n# b- X, h
1 row created.- x7 W* ^' M6 @9 v& e5 y1 r
SQL> insert into foo( col1 ) values (2);
3 r: ]  w3 o  m1 j5 e  s1 row created." n6 p3 R! N+ @- r4 k
SQL> insert into foo( col1 ) values (3);
, b7 H& A" b" b# b4 q& ~3 x% D3 g1 row created.
7 j) |$ g9 V( a: ~8 m3 \SQL> select * from foo;
/ P% z; D1 U/ H- \3 k      COL1 COL2
4 Y3 X- H+ Q  o6 L- a# D/ W; y---------- ----------
6 G9 w2 @; @/ W! x; l! e: a* t% S         1
, _; x2 }$ F6 p$ b         2
8 q8 O1 ~: B" n3 Y- H- |         3
5 U& A9 K1 t" Z9 d如果我随后更改表以设置默认值,则有关现有行的内容将保持不变
% J: O9 C( S# H5 ZSQL> alter table foo5 ^$ ~' f$ O( R7 E
  2    modify( col2 varchar2(10) default 'foo' );
) Z7 {6 H. |) pTable altered.
7 `# A) ~7 ?$ \2 c1 L& hSQL> select * from foo;
5 `+ _' V: |( ]' @" Z, z      COL1 COL2- j1 |  [% {- X; R  B3 u
---------- ----------& v6 m6 B( ?5 D& z+ n8 i
         1/ X  P$ Z8 E9 }& U
         26 Y. j. W  F6 ]3 D* x
         3: G+ }+ c) R& C5 ~" q
SQL> insert into foo( col1 ) values (4);$ L2 b7 g6 Z& \' f8 a
1 row created.
+ n6 V" X" o2 MSQL> select * from foo;
/ g/ V6 \0 v+ c" n      COL1 COL2
! Z4 R- a2 |4 K3 O+ V6 m---------- ----------4 o: h; i" y7 i/ j0 q4 X
         1
( V( S( l* p& ^! w% v* ^         20 D+ |  {( l  o) J9 E' K
         3
: ^, R6 [  ?2 z: e% v1 {         4 foo" P; c* `8 i7 d7 `2 q8 s6 d" }
即使随后我再次更改默认值,现有行也将保持不变
$ Y5 H( ~0 F1 s* G9 Y/ S+ H! eSQL> alter table foo
6 h- _; S) S) o2 e  2    modify( col2 varchar2(10) default 'bar' );
6 B  w* f& ~5 i9 R, M9 }1 oTable altered.
4 F6 U+ C# A% QSQL> select * from foo;
" Z3 w; g2 k+ \# c      COL1 COL28 {2 S$ x5 s+ j( I% N0 |6 d8 X% `9 p) N
---------- ----------
1 `: n7 v) @! a# l" P# @         1
/ I, r( P0 Q) Y1 `" P' T3 u         23 _$ E5 ], h2 H8 X+ g& A7 B: \  A
         3
8 [, M# ~: r) m1 W, Z- d: S         4 foo
4 k* y( }: u: q. LSQL> insert into foo( col1 ) values (5);+ T+ A' r2 x! c: m4 i
1 row created.
- g) s) z* l; t1 P2 ]6 qSQL> select * from foo;
$ K- z. q+ B0 V      COL1 COL2
% B+ \3 j4 Q# A2 {---------- ----------# b3 y/ R" |. ]7 u3 ^
         1
1 \/ g9 P# G8 s         2
- u& @1 @  j& g+ b9 A         3
% O: {- x+ \9 L$ F+ C         4 foo
% f6 A5 Z5 Y7 @         5 bar
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则