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条)

报告相同问题?

悬赏问题

  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程