我正在寻找一种方法来轻松检查MySQL数据库的每个表,并确保某个字段仅包含一个值。我有名为作者,标题,地方等的表。
每个表都包含一个名为xuser的字段,它需要询问“字段xuser是否包含所有表的所有记录中的值xy”。
如果有可能,有人可以用正确的方向推动我如何使用SQL查询吗?
感谢阅读,问候
尼科
答案 0 :(得分:0)
要获取所有三个表中的行,其中xuser
在您可以使用的所有三个表中具有相同的值:
SELECT *
FROM authors a
JOIN titles t
ON t.xuser = a.xuser
JOIN places p
ON p.xuser = t.xuser
如果您想查看特定的xuser
值,可以添加以下WHERE
子句:
WHERE a.xuser = 'xy'
答案 1 :(得分:0)
我想到了第一件事:
select sum(if(xuser='xxx', 1, -1)) = 1
from (
select distinct(xuser) from authors
union
select distinct(xuser) from titles
union
select distinct(xuser) from places
) all_xusers;
如果所有表包含仅属于'xxx'用户的记录,则返回1(true)。否则(如果没有'xxx'记录或有其他一些用户记录),它将返回0(false)。
答案 2 :(得分:0)
我创建了存储过程,它检查所有提供的数据库的表:
DELIMITER $$
DROP PROCEDURE IF EXISTS `UTL_CHECK_BACKUP_FOR_USER` $$
CREATE PROCEDURE `UTL_CHECK_BACKUP_FOR_USER`(
IN i_database_name VARCHAR(255),
IN i_user_column_name VARCHAR(255),
IN i_user_column_value VARCHAR(255),
OUT o_result TINYINT(1)
)
BEGIN
DECLARE v_table_name VARCHAR(255);
DECLARE v_last_row_fetched TINYINT(3) DEFAULT 0;
DECLARE tables_cursor CURSOR FOR
SELECT table_name
FROM information_schema.tables
WHERE table_schema = i_database_name
;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_last_row_fetched = 1;
SET v_last_row_fetched = 0;
OPEN tables_cursor;
SET @query =
CONCAT(
'SELECT SUM(IF(user_column=''',
i_user_column_value,
''', 1, -1)) = 1 INTO @o_result FROM ( SELECT ''test'' AS user_column FROM information_schema.tables WHERE 1<>1 '
)
;
table_loop: LOOP
FETCH tables_cursor INTO v_table_name;
IF (v_last_row_fetched = 1) THEN
LEAVE table_loop;
END IF;
SET @query =
CONCAT(
@query,
' UNION SELECT DISTINCT(',
i_user_column_name,
') AS user_column FROM ',
v_table_name
)
;
END LOOP table_loop;
CLOSE tables_cursor;
SET v_last_row_fetched=0;
SET @query =
CONCAT(
@query,
' ) all_xusers;'
)
;
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET o_result = COALESCE(@o_result, 0);
END $$
DELIMITER ;
只需将此存储过程部署到数据库即可。 然后它可以通过以下方式执行:
-- db_name, user_column_name, user_column_value, result
call UTL_CHECK_BACKUP_FOR_USER('test', 'xuser', 'xxx', @result);
select @result;