我的表包含许多字段。我想要的是创建一个查询,它将更新我的表中包含\'到\\\'的每个字段。对于一个字段,查询是
更新表集column1 = replace(column1,'\'','\\\'');
但如果我必须在所有字段中替换相同的内容,该怎么办?我是否必须为每个字段编写相同的查询?有没有办法写一个将更新所有字段的查询。
答案 0 :(得分:1)
问:我是否必须为每个字段编写相同的查询?有没有办法编写一个更新所有字段的查询?
需要引用要更新的每个列。您可以在单个语句中更新多个列。 (你不必单独发表声明;一举更新它们会更有效率。
UPDATE mytable
SET col1 = expr1
, col2 = expr2
, col3 = expr3
但我们确实需要明确引用我们想要更新的每一列。
我们可以使用SQL语句来获取列名。可能,我们想要排除整数/十进制/浮点列,以及ENUM,SET,DATE,DATETIME,TIMESTAMP等。以下是获取列名称的查询示例:
SELECT c.column_name
FROM information_schema.columns
WHERE c.table_schema = 'mydatabase'
AND c.table_name = 'mytable'
注意:反斜杠字符是MySQL文字中的转义字符,
将反斜杠和单引号表示为字符串文字
'\\'''
将三个反斜杠和一个引号表示为字符串文字
'\\\\\\'''
如果我想用文字反斜杠和单引号替换单引号的出现,我会使用这样的表达式:
REPLACE(foo, '''', '\\''')
当我需要做这样的事情时,为了引用一堆列,我将使用一个查询来帮助生成一些表达式;像这样的东西:
SELECT CONCAT(',`',c.column_name,'` = REPLACE(`',c.column_name
,'`,'''''''',''\\\\'''''')') AS expr
FROM information_schema.columns c
WHERE c.table_schema = 'mydatabase'
AND c.table_name = 'mytable'
AND c.data_type IN ('char','varchar')
然后我可以获取为expr
返回的值,并在后续语句中使用它。另外请注意增加列中的字符数,这不会超过最大大小。
答案 1 :(得分:0)
你可以使用它。
UPDATE table1, table2, ...
SET column1 = expression1,
column2 = expression2,
...
WHERE table1.column = table2.column
AND conditions;
如果要更新具有相同数据的两个表,则可能有更好的方法来设计数据库。请记住保持编程干燥
DECLARE col_names CURSOR FOR
SELECT column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
ORDER BY ordinal_position;
select FOUND_ROWS() into num_rows;
SET i = 1;
the_loop: LOOP
IF i > num_rows THEN
CLOSE col_names;
LEAVE the_loop;
END IF;
FETCH col_names INTO col_name; //do whatever else you need to do with the col name
SET i = i + 1;
END LOOP the_loop;
答案 2 :(得分:0)
这是错误的方法。数据库中的数据应该是未转义的。也就是说,您应该'
,而不是\'
或\\\'
。您应用程序应该期望检索'
并在必要时为下一步发生的事件添加转义。
如果您使用的是PHP,请使用
urlencode()
用于创建网址htmlentities()
用于转义导致HTML出现问题的4件事:"&<>
nl2br()
让NL或CR表现得像<br>
\'
;见mysqli_real_escape_string()。