首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL设计:用重写表示默认值?

SQL设计:用重写表示默认值?
EN

Stack Overflow用户
提问于 2010-04-27 07:15:55
回答 5查看 1K关注 0票数 1

我需要一个稀疏表,其中包含另一个表的一组“覆盖”值。我还需要为被覆盖的项指定默认值。

例如,如果默认值为17,则foo、bar、baz的值为17、21、17:

代码语言:javascript
复制
table "things"   table "xvalue"
name  stuff      name xval
----  -----      ---- ----
 foo  ...         bar   21
 bar  ...
 baz  ...

如果我不关心来自xvalue.name -> things.name的FK,我可以简单地放一个“默认”名称:

代码语言:javascript
复制
                 table "xvalue"
                 name xval
                 ---- ----
              DEFAULT   17
                  bar   21

但我喜欢玩FK。我可以有一个单独的默认表,但是有2倍的表数似乎很奇怪。

代码语言:javascript
复制
                 table "xvalue_default"
                      xval
                      ----
                        17

                 table "xvalue"
                 name xval
                 ---- ----
                  bar   21

我可以有一个“默认表”。

代码语言:javascript
复制
            tablename  attributename  defaultvalue
               xvalue           xval            17

但是后来我在defaultvalue上遇到了类型问题。

我的运维人员喜欢尽可能紧凑的表示,这样他们就可以最容易地看到与默认值的“差异”或偏差。

表示这一点的最佳方式是什么,包括默认值?这将适用于Oracle 10.2,如果这会有所不同的话。

EN

回答 5

Stack Overflow用户

发布于 2010-04-27 07:28:38

使用视图怎么样?在视图中,您对表xvalue执行外连接,如果xval为空,则使用coalesce函数返回默认值。

票数 1
EN

Stack Overflow用户

发布于 2010-04-28 01:17:07

我们可以在创建表时定义列的默认值...

代码语言:javascript
复制
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>

如果不指定任何内容,则会自动应用这些值:

代码语言:javascript
复制
SQL> insert into t34
  2      (id)
  3  values
  4      (1)
  5  /

1 row created.

SQL>

或者,如果我们想指定一些值而不指定其他值,我们可以使用DEFAULT关键字

代码语言:javascript
复制
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使用的是卑劣的长数据类型,这降低了它的可用性。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-04-28 02:53:52

我相信触发器是处理像这样的复杂业务规则的最佳方式。只需确保您将其设置(并测试)为当有人在一个操作中插入或更新多个行时工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2717615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档