mariadb 为具有相同电子邮件地址的用户生成唯一密钥

lxkprmvk  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(119)

我们有一个表与订单的客户喜欢:

CREATE TABLE `orders` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `number` varchar(20) NOT NULL,
    `ordered` datetime DEFAULT NULL,
    `email` varchar(255) NOT NULL,
    ...
);

表中已填充数据。我需要添加一个字段:

`user` int(10) unsigned NOT NULL,

其中包含每个客户的唯一编号。客户由相同的电子邮件地址定义,因此电子邮件地址为“test@example.com”的所有订单应获得1,电子邮件地址为“something_else@example.com”的所有订单应获得2,依此类推。
对于这个“用户”号码,它是从1开始还是以某种方式递增并不重要,它只是应该对每个电子邮件地址不同。
有没有办法在一个SQL语句中做到这一点?我知道如何用一些PHP代码来做,例如,但我们很好奇,如果只使用SQL是可能的。我们知道,如果有一个表“客户”,这将是一个更好的设计,但这不是我们的设计,我们只是试图修复最坏的事情;)

7vhp5slm

7vhp5slm1#

在一个SQL语句中不可能完成您所描述的操作。
即使您不想让每个电子邮件的用户ID都是唯一的,您的ALTER TABLE也不会起作用。您显示添加了一个NOT NULL列,但没有DEFAULT。那么,如果表中有行,它应该向表中添加什么值呢?它不能使用NULL。并且它没有DEFAULT值。您不能将该列作为AUTO_INCREMENT添加,因为您已经有了一个AUTO_INCREMENT的id列,而MySQL不允许一个表有两个这样的列。
我会这样做:

CREATE TABLE customers (
 id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 email VARCHAR(255) NOT NULL
);

INSERT INTO customers (email)
SELECT DISTINCT email FROM orders;

ALTER TABLE orders ADD COLUMN user_id INT UNSIGNED; -- this allows NULLs until we fill it

UPDATE orders JOIN customers USING (email)
SET orders.user_id = customers.id;

在执行下一步之前,请确保orders.user_id已经以您认为正确的方式填充。一旦删除了orders.email列,就无法撤消。最好先进行备份。

ALTER TABLE orders DROP COLUMN email,
  MODIFY COLUMN user_ID INT UNSIGNED NOT NULL; -- disallow NULLs from now on

相关问题