Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Insert into One-to-One Relationship

Tags:

mysql

My MySQL database contains two tables: user and coupon (one-to-one relationship).

I would like to select all users that do not have a coupon and create a new one (random and unique).

user TABLE:
___________________________________
|  id   |   name   |   coupon_id  |
-----------------------------------
   1        John         5
   2        Mary         (null)  // Need to create one coupon.
   3        Doe          2
   4        Max          (null)  // Need to create one coupon.
   5        Rex          1
   7        Bill         (null)  // Need to create one coupon.


coupon TABLE:
______________________________________________
|  id   |   code (random 6-chars - unique)   |
----------------------------------------------
   1        80k2ni
   2        0akdne
   5        nk03jd

Shortcuts:

Select all users without coupon: SELECT * from user WHERE coupon_id IS NULL;

Generate a random 6-chars string (MySQL): LEFT(sha1(rand()), 6).

like image 216
Luciano Nascimento Avatar asked Nov 26 '25 21:11

Luciano Nascimento


1 Answers

Assuming you don't mind continuing upwards from 6 for the next coupon_id, this can be done as follows (see SQL Fiddle Demo):

-- Declare and set variables
SET @id_for_insert = (SELECT MAX(`id`) FROM `coupon`);
SET @id_for_update = @id_for_insert;

-- Insert new coupons
INSERT INTO `coupon` (id, code)
SELECT @id_for_insert := @id_for_insert + 1, LEFT(SHA1(RAND()), 6)
FROM `user`
WHERE coupon_id IS NULL;

-- Update users that don't already have a coupon with the newly created coupons
UPDATE `user`
SET coupon_id = @id_for_update := @id_for_update + 1
WHERE coupon_id IS NULL;
like image 62
Steve Chambers Avatar answered Nov 29 '25 18:11

Steve Chambers



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!