【问题标题】:Sql update column every time a row is inserted每次插入一行时sql更新列
【发布时间】:2023-04-09 00:49:01
【问题描述】:

好的,所以我有这张桌子: 版本编辑器 和 id - bigint 版本 - 整数 开始日期-日期 endDate - 日期 bookId - 整数

我的问题: 当我为某本书插入新行时,endDate 值必须为“进行中”。所以我认为我不能将日期作为列类型.. 逻辑是当我拥有某本书的最佳版本时,endDate 必须是“进行中”

【问题讨论】:

  • 将 endDate 设为 Varchar
  • 为什么不把它简单地保留为NULL 作为正在进行的标志?@alex1111

标签: java sql sybase


【解决方案1】:

为什么要使用日期列来表示状态?相反,您需要另一列状态。我可能会建议一个观点:

create view v_book as
    select b.*,
           (case when startDate is null then 'NotStarted'
                 when endDate is null then 'InProgress'
                 else 'Done'
            end) as Status
    from books

【讨论】:

    【解决方案2】:

    触发器怎么样(Oracle DB) 就这样……

    CREATE OR REPLACE TRIGGER t
      BEFORE
        INSERT OR
        UPDATE OF salary, department_id OR
        DELETE
      ON employees
    BEGIN
      CASE
        WHEN INSERTING THEN
          DBMS_OUTPUT.PUT_LINE('Inserting');
        WHEN UPDATING('salary') THEN
          DBMS_OUTPUT.PUT_LINE('Updating salary');
        WHEN UPDATING('department_id') THEN
          DBMS_OUTPUT.PUT_LINE('Updating department ID');
        WHEN DELETING THEN
          DBMS_OUTPUT.PUT_LINE('Deleting');
      END CASE;
    END;
    /
    

    【讨论】:

      【解决方案3】:

      日期应该是日期,而不是整数或 varchar。如果“进行中”的含义是不能指定任何日期,则在进行中时将其设置为空。你可以这样查询它:

      select coalesce( to_char(enddate, 'DD-MM-YYYY') , 'In progress' ) as end_date
      from mytable
      where ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        相关资源
        最近更新 更多