回答

收藏

修改表以修改列的默认值

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

我有一个需要修改数据库表中列默认值的要求。该表已经是数据库中的现有表,并且当前该列的默认值为NULL。现在,如果将新的默认值添加到此列,如果我是正确的话,它将列的所有现有NULL更新为新的DEfault值。有没有一种方法可以不执行此操作,但仍在列上设置新的默认值。我的意思是我不想更新现有的NULL,并希望它们保留为NULL。: s( _  E2 u8 }; b- n0 O
在这方面的任何帮助,不胜感激。谢谢! f( }6 j) L5 w0 g; D
                8 ?  L: K$ J& v9 x2 Q
解决方案:1 e4 L$ B9 c; q5 T2 m0 I, \
               
- q* J  `7 i6 w( X  j+ Y9 s; B* h1 s& s' t
" k/ O  L, u& L: I
                您对将会发生的事情的信念是不正确的。为列设置默认值不会影响表中的现有数据。3 X, L* S0 L$ e, }
我创建一个表,该表的列col2没有默认值0 k9 N- T: Q+ G
SQL> create table foo(
, V7 {* v  e! G8 `  2    col1 number primary key,6 w; C* f! M6 t) J' D: L' _
  3    col2 varchar2(10)
8 ^# F5 D7 R% a+ T: z+ ?  4  );% P8 i8 b3 Q5 |& ]$ ^
Table created.
$ |+ K# m6 c2 d. x- x( xSQL> insert into foo( col1 ) values (1);9 L( F0 x1 X$ F2 Y1 F6 [! b3 X- N
1 row created.
3 |0 \' A& T) x7 C. YSQL> insert into foo( col1 ) values (2);- K: ~* ?+ Y+ h. @( K+ e8 u0 K
1 row created.
" R' R5 W0 x0 OSQL> insert into foo( col1 ) values (3);2 N9 s1 H! v% d; ^3 T8 v. }3 Q
1 row created.' t' D, w5 m  _2 A: t6 l+ A$ y
SQL> select * from foo;
" E! Y: V5 }# u4 H      COL1 COL2
  e; F0 a$ C& L) @- R: r) N---------- ----------
9 e; J  q" u4 Z; M% f         1! F' f3 S7 g* [( d
         2
8 P9 [" }. x  o0 O         3
8 \$ O* |! m( F) F% o如果我随后更改表以设置默认值,则有关现有行的内容将保持不变& E: u, C( K) \( O: |
SQL> alter table foo' f; p# |% ?1 C4 ~; P9 A' X
  2    modify( col2 varchar2(10) default 'foo' );
: F9 K) r: e7 O9 {# {" ^Table altered.
& I& H/ s: O- _5 aSQL> select * from foo;4 I" v. F+ j. M4 G
      COL1 COL20 i3 D% x4 o) K0 b1 O
---------- ----------5 Z4 o7 B! y- m/ s
         1: }" Q& ~2 r. i9 r7 m" `. Y9 R1 t- f
         2" x+ j0 R! Q- d
         3
1 r& p6 D/ l( F+ G$ dSQL> insert into foo( col1 ) values (4);
5 Q" K- N; S1 P: u1 row created.
# ~4 E5 g( o6 y/ Y6 PSQL> select * from foo;
/ H" c" q+ \9 R& w1 q      COL1 COL22 j. ~$ e; q! n( _5 ?! ~8 Z' O
---------- ----------1 R$ c2 v2 r, n5 Z
         1
" {3 n) h6 f  C6 o- ?% |1 U; u         27 H: N' ]0 I/ S3 T
         3
4 C6 L# Z( i. N* v% z- m         4 foo
8 h( u$ u1 R- z! p5 t; c( V+ f8 o即使随后我再次更改默认值,现有行也将保持不变2 s) Q7 t  C5 z4 M
SQL> alter table foo% d5 q* _% r. E2 W6 w
  2    modify( col2 varchar2(10) default 'bar' );' W* ?1 z! Q6 w* g7 n# b
Table altered.
9 Y$ u& ?* B  n7 ]# sSQL> select * from foo;
' N/ ^2 z( j( x7 G5 ?+ l$ f4 D      COL1 COL2
" V8 H' F- n$ t---------- ----------6 f$ `' s- ^. j
         1
  o( z, `0 v+ k$ M& d& @& N         2! V' M6 c. g3 K, V* C
         3
: ?7 n: k6 c/ o$ H( p) \6 Q         4 foo2 d# g; v: G; ^0 o: z1 T4 q+ J
SQL> insert into foo( col1 ) values (5);
6 u0 ], \  G2 u1 K& m1 row created.0 `" R9 ?$ {8 k7 v  C1 O0 i) f- ~
SQL> select * from foo;
  E, ~9 h5 N" \! F' ?      COL1 COL2
1 e- ]4 K# E1 O! n---------- ----------
3 G9 t, W- r6 e9 u* k         1
/ c1 t5 \  i; V! v         2) ~8 R2 J; ?4 X$ L( w; ]1 u* B
         3# ~, h) w, G' f' `0 Z9 G! E
         4 foo/ L  `  O2 @# Z0 B
         5 bar
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则