【问题标题】:mysql: how to perform these 2 tasksmysql:如何执行这两个任务
【发布时间】:2010-07-30 16:49:15
【问题描述】:

如何在mysql中做到以下几点(可能使用phpmyadmin):

1) 给定现有的数值列 (colA),创建一个包含文本数据的新列 (colB),如果 colA = 0,则自动用“typeA”填充该列,如果 colB > 0,则自动填充“typeB”?

2) 给定以下 2 个表用户和文档:

表用户有“用户名”和“用户ID”列, Table Docs 有“DocID”、“用户名”和“用户 ID”列(我知道这是多余的)

Docs 表中的 Username 列是空的,我必须根据 UserID 自动填充它。

这两个任务的 SQL 代码是什么?

谢谢

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:

    对于第一个,你可以这样做:

    UPDATE table_1 SET colB=IF(colA=0, 'typeA', IF(colA>0, 'typeB', '???'));
    

    我不知道你如何在你的问题中指定“and”typeB” if colB > 0”是否可以,因为 colB 是你要写的列。

    对于您的第二个问题,您应该使用视图来获得表 Docs 中的用户名。无论如何要更新它,您可以使用以下内容:

    UPDATE Docs d SET Username=(SELECT Username FROM Users u WHERE u.UserID=d.UserId)
    

    这里是如何创建一个包含用户名的视图:

    CREATE VIEW Docs_view AS
    SELECT Docs.*, Users.Username
    FROM Docs
    LEFT JOIN Users ON Docs.UserID=Users.UserID;
    

    首先从Docs 中删除列Username

    现在,当您要选择文档时,您也可以看到用户名:

    SELECT * FROM Docs_view
    

    并且当你添加一条新记录时,你只需要指定UserID

    【讨论】:

      【解决方案2】:

      对于第一个,我认为True Soft的答案应该有效。

      对于第二个问题,您可能希望使用触发器来维护非规范化的用户名字段。

      
      DELIMITER //
      
      CREATE TRIGGER Docs_after_insert_trigger AFTER INSERT ON Docs
      FOR EACH ROW
      BEGIN
          IF ( COALESCE(@DISABLE_TRIGGERS, 0)  1 ) THEN
              UPDATE Docs 
                  SET Username = ( SELECT Username FROM Users where UserID = new.UserID ) 
                  WHERE DocID = new.DocID;
          END IF;
      END //
      

      如果文档将更改用户 ID 和用户名,则为“更新后”创建一个类似的触发器,将所有“插入”更改为“更新”,以便更新它们以保持同步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 2020-01-27
        • 2014-09-28
        • 1970-01-01
        相关资源
        最近更新 更多