简体   繁体   English

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

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

I have a table named "orders" in an SQL database: 我在SQL数据库中有一个名为“ orders”的表:

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

The "id" is set to AUTO_INCREMENT and the "date" is created when I insert data via my php form: 当我通过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();
        }
}

I wish that the value for "orderID" is created automatically from the values "id" and "date": 我希望从值“ id”和“日期”自动创建“ orderID”的值:

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

Due to the fact, that the id is an AUTO_INCREMENT you have no hand on this value. 由于这个事实,该ID是AUTO_INCREMENT您无法使用此值。 But it's quite simple. 但这很简单。 Add a AFTER INSERT trigger to the table and let it update the orderID column afterwards. AFTER INSERT触发器添加到表中,然后让它更新orderID列。

Here a quick example of a AFTER UPDATE trigger. 这里是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; 

try 尝试

    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();
    }

should work now 现在应该工作

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

Don't create another column in your database to hold this value, it's just duplicated data and will only serve to take up unnecessary space. 不要在数据库中创建另一个列来保存此值,它只是重复的数据,只会占用不必要的空间。

When you are retrieving data you can use CONCAT(id, date) AS orderid to get the concatenated value. 检索数据时,可以使用CONCAT(id, date) AS orderid来获取串联值。

For example, to get all orderids for John: 例如,要获取约翰的所有订单编号:

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