dsgk40568 2015-12-22 11:06
浏览 27
已采纳

如何将最后插入的两个其他表的唯一组合外键作为单个键

Lets take three tables... USER, PRODUCT, ORDERS.

USER(user_id,name); 
PRODUCT(product_id,price);  
ORDERS(user_id,product_id,order_code,paid);

here we have user_id and product_id in ORDERS table as foreign key for USER and PRODUCT tables which together makes a unique index.

Oright..

Assume that there are data rows in user and product tables.
So, I'm inserting into ORDERS table

INSERT INTO ORDERS(user_id,product_id,paid) VALUES ('2','1','true');

SELECT @lid:= /* some function which can return last inserted combination of foreign keys as single identifier */;

UPDATE ORDERS SET order_code=concat(
    substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
              substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
             )
     WHERE /*in here combined foreign key*/ = @lid;

I want to get the last inserted id (as in LAST_INSERT_ID) of two foreign keys as a single key which can be used to update the table.

Now, I know that I can accomplish this by introducing a primary key to ORDERS table which will solve the problem as such. But, I don't want to do that.

I have also searched this type of questions but it didn't solve my problem.

Any help is appreciable. Thanks in Advance.

  • 写回答

3条回答 默认 最新

  • douzhiji2020 2015-12-22 11:45
    关注

    Well, this might work... create a column with auto_increment named inc then

    INSERT INTO ORDERS(user_id,product_id,paid) VALUES ('2','1','true');
    
    SELECT @lid:= select max(inc) from ORDERS;
    
    UPDATE ORDERS SET order_code=concat(
        substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
                  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
                  substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1)
                 )
         WHERE inc = @lid;
    

    your are done.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程