我需要用测试数据填充我的数据库。我有一个表“Citizen”的列:
---------------------
| CITIZEN |
---------------------
| id INT |
| name VARCHAR |
| city VARCHAR |
| birthDate DATETIME|
| pesel INT |
--------------------
拉斯专栏 - PESEL,是波兰使用的个人身份证号码。它有11位数字,其中前六位是从最后写的出生日期,如:910111,意思是1991年1月11日(1月11日)。 7-10中的数字可以是随机数,但最后一位数是通过以下公式计算的校验和:
1*a + 3*b + 7*c + 9*d + 1*e + 3*f + 7*g + 9*h + 1*i + 3*j
where letters from a to j stand for each digit of PESEL number.
现在我已经填写了所有其他专栏,接受PESEL。我需要大约100 000条记录,所以我在循环中生成它们,而不是手动完成。但是我不知道如何确定一个数字的每个数字并将它与我在birthDate列中的出生日期相关联... 我将不胜感激任何帮助。
答案 0 :(得分:2)
如果您可以使用外部编程语言,则可以使用(例如)this Ruby library为每行生成正确的PESEL编号。
另一方面,如果你想在MySQL中单独使用,你可以使用类似下面的函数(基于上面提到的Ruby库):
CREATE FUNCTION Pesel(birthDate VARCHAR(6)) RETURNS VARCHAR(11)
BEGIN
DECLARE result VARCHAR(11);
SELECT CONCAT(A, B, C, D, E, F, G, H, I, J,
IF(((1*A + 3*B + 7*C + 9*D + 1*E + 3*F + 7*G + 9*H + 1*I + 3*J) % 10) = 10
, 0
,(1*A + 3*B + 7*C + 9*D + 1*E + 3*F + 7*G + 9*H + 1*I + 3*J) % 10)) AS pesel
INTO result
FROM (SELECT SUBSTR(birthDate,1,1) AS A,
SUBSTR(birthDate,2,1) AS B,
SUBSTR(birthDate,3,1) AS C,
SUBSTR(birthDate,4,1) AS D,
SUBSTR(birthDate,5,1) AS E,
SUBSTR(birthDate,6,1) AS F,
FLOOR(RAND()*10) AS G,
FLOOR(RAND()*10) AS H,
FLOOR(RAND()*10) AS I,
FLOOR(RAND()*10) AS J) AS tmp;
return result;
END
然后使用它来更新列,如下所示:
UPDATE CITIZEN
SET pesel = Pesel(DATE_FORMAT(birthDate,"%y%m%d"))
请注意,我现在使用VARCHAR(11)
作为pesel
列的日期类型,这更容易找出该功能。如果您想使用SQL,可以使用此SQL Fiddle。
答案 1 :(得分:0)
ebo发布的解决方案很棒,但是如果数字%10 = 10则没有必要使用。" number"的价值并不重要。 - 没有办法让结果等于10。
我遇到了与postgresql相同的问题,所以有一个select返回来自table" sometable"的所有bith_dates的pesel。 birth_date的格式为YYYY-MM-DD
SELECT CONCAT(A || B || C || D || E || F || G || H || I || J,
((1*A::int + 3*B::int + 7*C::int + 9*D::int + 1*E::int + 3*F::int + 7*G::int
+ 9*H::int + 1*I::int + 3*J::int) % 10)::text
)AS "PESEL" FROM
(SELECT SUBSTRING(bith_date::text,3,1) AS A,
SUBSTRING(bith_date::text,4,1) AS B,
SUBSTRING(bith_date::text,6,1) AS C,
SUBSTRING(bith_date::text,7,1) AS D,
SUBSTRING(bith_date::text,9,1) AS E,
SUBSTRING(bith_date::text,10,1) AS F,
FLOOR(RANDOM()*10)::text AS G,
FLOOR(RANDOM()*10)::text AS H,
FLOOR(RANDOM()*10)::text AS I,
FLOOR(RANDOM()*10)::text AS J
FROM sometable) AS tmp