我有一个包含成员的mysql表,大约有1400条记录,我将切换到一个新的会员软件(amember v3到amemberv4)。问题是amember v4是一个全新的程序,因此数据库表不能有任何丢失的记录,或者它将根据主键重新排序。例如,成员表中的成员身份ID与产品表中的产品ID相关联。有一个事实表引用了这个维度。
我的问题是如何使用缺少的起始成员身份ID添加空记录。例如,表格以会员ID 4而不是1,2,3开头。我需要帮助找到一个解决方案,根据缺少的成员身份ID添加这些丢失的记录。我确实根据第一个表(membersold,members)创建了第二个表,因为我确信我需要将它们彼此连接起来创建一个更新语句来添加那些丢失的记录。大约有7列只是空值。
有什么想法吗?
答案 0 :(得分:0)
首先:Jan Dvorak和Michael Berkowski所说的绝对正确。因此,仔细检查您确实需要此黑客,因为您不的可能性非常大。
但是为了以防万一,只是为了它,它将所有ID插入表中 - 只要它们是主键,并且它们不存在。
几乎任何其他方式都更好(除非可以手工完成),但需要使用MySQL或其他语言的程序。
-- insert IDs from 1 to 1701, plus another field "otherfield" with value "othervalue"
-- The maximum ID here is about 2400, but you said you needed at most 1400.
-- And you can add 1000 instead of 1 to the value of 'id' and run it again
-- to insert ids from 1000 to 2701 :-)
INSERT IGNORE INTO yourtable
(id, otherfield)
SELECT id, 'othervalue'
FROM (
SELECT 1+a.x+b.x*7+c.x*49+d.x*343 AS id FROM
( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS a
JOIN
( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS b
JOIN
( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS c
JOIN
( SELECT 0 AS x UNION SELECT 1 UNION SELECT 2 UNION
SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 ) AS d
) AS generated
WHERE generated.id < 1701;
正如我所说,这是一种非常丑陋的做事方式。
如果您有任何语言可用,您可以生成插入查询并运行它们,例如在bash:
( for id in $( seq 1 1400 ); do
echo "INSERT IGNORE INTO mytable ( id, otherfield ) VALUES ( $id, 'hello' );"
done ) | mysql databasename
或在PHP,python或Perl中 - 您只需生成表单
的SQL INSERT语句INSERT IGNORE INTO mytable ( id ) VALUES ( ... );
并使用递增计数器填充空白,然后将语句发送到数据库。 IGNORE
将跳过已存在的值。如何填写空白取决于您选择的语言。如果您需要填充其他字段,请在空格后输入id
之后的名称及其默认值。