检查MySQL数据库在许多表上的唯一值

时间:2014-07-31 10:00:08

标签: mysql

我正在寻找一种方法来轻松检查MySQL数据库的每个表,并确保某个字段仅包含一个值。我有名为作者,标题,地方等的表。

每个表都包含一个名为xuser的字段,它需要询问“字段xuser是否包含所有表的所有记录中的值xy”。

如果有可能,有人可以用正确的方向推动我如何使用SQL查询吗?

感谢阅读,问候

尼科

3 个答案:

答案 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;