我需要一个稀疏表,其中包含一组“覆盖”值 另一张桌子。我还需要指定默认值 物品被覆盖。
例如,如果默认值为17,则foo,bar,baz将具有 值17,21,17:
table "things" table "xvalue"
name stuff name xval
---- ----- ---- ----
foo ... bar 21
bar ...
baz ...
如果我不关心xvalue.name中的FK - > things.name,我可以简单 提出“默认”名称:
table "xvalue"
name xval
---- ----
DEFAULT 17
bar 21
但我喜欢拥有FK。我可以有一个单独的默认表,但它 表格数量的2倍似乎很奇怪。
table "xvalue_default"
xval
----
17
table "xvalue"
name xval
---- ----
bar 21
我可以有一个“默认表”
tablename attributename defaultvalue
xvalue xval 17
但后来我遇到了defaultvalue上的类型问题。
我的操作人员更喜欢尽可能紧凑的表现形式, 所以他们最容易看到“差异”或偏离 默认值。
表示此问题的最佳方式是什么,包括默认值?如果有所不同,这将适用于Oracle 10.2。
答案 0 :(得分:1)
我们可以在创建表时为列定义默认值...
SQL> create table t34 (
2 id number not null
3 , col1 varchar2(30) default user
4 , col2 date default sysdate
5 , col3 char(1) default 'N' )
6 /
Table created.
SQL>
如果我们不指定任何内容,则会自动应用这些值:
SQL> insert into t34
2 (id)
3 values
4 (1)
5 /
1 row created.
SQL>
或者,如果我们想要指定一些值而不指定其他值,我们可以使用DEFAULT关键字
SQL> insert into t34
2 values
3 (2, null, default, 'Y')
4 /
1 row created.
SQL> select * from t34
2 /
ID COL1 COL2 C
---------- ------------------------------ --------- -
1 APC 27-APR-10 N
2 27-APR-10 Y
SQL>
我们可以在数据字典视图USER_TAB_COLUMNS中找到默认值。不幸的是,DATA_DEFAULT属于卑鄙的LONG数据类型,这降低了它的可用性。
SQL> select column_name, data_default
2 from user_tab_columns
3 where table_name = 'T34'
4 /
COLUMN_NAME DATA_DEFAULT
------------------------------ ------------------------------
ID
COL1 user
COL2 sysdate
COL3 'N'
SQL>
覆盖值
存储一组覆盖值 - 备用默认值 - 比较棘手。我担心你浮动的外键是不起作用的,因为我们无法在应用程序数据中引用数据字典的元数据。
我不完全清楚你要解决的业务问题,因此建议替代方案有点困难。但大多数方法可能需要动态SQL。
答案 1 :(得分:0)
使用视图怎么样?在视图中,您对表xvalue执行外连接,然后使用coalesce函数在xval为null时返回默认值。
答案 2 :(得分:0)
我认为触发器是处理这种复杂业务规则的最佳方式。当有人在一个操作中插入或更新多行时,请确保将其设置(并进行测试)。
答案 3 :(得分:0)
这是否符合您的意图?
SELECT TABLE_NAME, STUFF, NVL(XVAL, 17) XVAL
FROM THINGS, XVALUE
WHERE THINGS.TABLE_NAME(+) = XVALUE.TABLE_NAME
答案 4 :(得分:0)
首先,使用列定义的默认值设置。
如果由于某种原因你无法做到这一点,请做其他几件事:
我真的不能想到我会将默认值存储在名称/值对表中的情况。太难以为此工作了。