繁体   English   中英

如何从SQL的同一表中的其他两个值创建值?

[英]How can I create a value from two other values in the same table in my SQL?

我在SQL数据库中有一个名为“ orders”的表:

id  date   name  orderID
========================
1   1502   John    ?
2   1502   Jane    ?

当我通过php表单插入数据时,“ id”设置为AUTO_INCREMENT,并创建“ date”:

if ( !empty($_POST)) {
        $name = $_POST['name'];
        $valid = true;


        if ($valid) {
            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "INSERT INTO orders (name,date) values(?,CURDATE())";
            $q = $pdo->prepare($sql);
            $q->execute(array($name));
            Database::disconnect();
        }
}

我希望从值“ id”和“日期”自动创建“ orderID”的值:

id  date   name  orderID
========================
1   1502   John    15021
2   1502   Jane    15022

由于这个事实,该ID是AUTO_INCREMENT您无法使用此值。 但这很简单。 AFTER INSERT触发器添加到表中,然后让它更新orderID列。

这里是AFTER UPDATE触发器的快速示例。

CREATE TRIGGER yourTrigger
AFTER INSERT
   ON yourTable FOR EACH ROW

BEGIN
    UPDATE yourTable
    SET orderid = CAST(date as char(4)) + CAST(id as char(1))
    WHERE ID = NEW.id

END; 

尝试

    if ($valid) {
        $pdo = Database::connect();
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "INSERT INTO orders (name,date) values(?,CURDATE())";
        $q = $pdo->prepare($sql);
        $q->execute(array($name));

        $q = $pdo->prepare( '
             update orders
             set orderId = id
             where id = SELECT LAST_INSERT_ID()'
        );
        $q->execute();          

        Database::disconnect();
    }

现在应该工作

SET @last_id_in_table1 = LAST_INSERT_ID();
INSERT INTO orders (name,date,orderID) values(?,CURDATE(),@last_id_in_table1 )

不要在数据库中创建另一个列来保存此值,它只是重复的数据,只会占用不必要的空间。

检索数据时,可以使用CONCAT(id, date) AS orderid来获取串联值。

例如,要获取约翰的所有订单编号:

SELECT CONCAT(id,date) AS orderid from `orders` WHERE `name`="John"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM