SET列的值列表能从另一个数据表中取得,
但不能保持与另一个表中的数据同步因为mysql数据库没有这样的完整性约束,只能由程序控制两个表之间的同步

解决方案 »

  1.   

    MYSQL目前没有提供这样的完整性控制,只能由程序进行控制!
      

  2.   

    使用merge表类型,可以达到你的要求!
    具体操作请看manual之merge table章节!
      

  3.   

    6.2.3.4 SET 类型SET 是一个字符串对象,它可以有 0 或更多个值,每个值均必须选自一个允许值列表中,该列表在表创建时被指定。包含多个集合成员的 SET 列值,由逗号(“,”)将各成员分隔。由此推论,SET 成员值自身不应该包含逗号。 例如,一个指定为 SET("one", "two") NOT NULL 的列可以有下列任一值: ""
    "one"
    "two"
    "one,two"一个 SET 最大可以有 64 个不同的成员。 从 3.23.51 开始,当表被创建时,SET 值尾部的空格将被自动地删除。 MySQL 以数字值存储 SET 值,以被存储值的低阶比特位(bit)对应于第一个集合成员。如果在一个数字语境中检索一个 SET 值,检索的值把比特位设置为对应组成列值的集合成员。例如,你可以使用下面所示的示例从一个 SET 列中检索出一个数字: mysql> SELECT set_col+0 FROM tbl_name;如果将一个数字存储到一个 SET 列中,被设置的数字的二进制表示法的比特位决定列值中的集合成员。假设一个列被定义为 SET("a","b","c","d")。那么它的成员有下面所示的比特值: SET 成员  十进制值  二进制值  
    a  1  0001  
    b  2  0010  
    c  4  0100  
    d  8  1000  如果将值 9(二进制的 1001) 赋给这个列,那么 SET 值的第一个和第四个成员 "a" 和 "d" 被选择,结果值为 "a,d"。 对于包含超过一个 SET 成员的值,当你插入值时,无所谓以什么顺序列出成员。也无所谓给出的值被列举了多少次。当以后检索该值时,在值中的每个成员将出现一次,根据他们在表创建时所指定的顺序列出成员。例如,如果一个列被定义为 SET("a","b","c","d"),那么,"a,d"、"d,a" 和 "d,a,a,d,d" 在被检索时均将被视为 "a,d"。 如果将一个不支持的值赋于一个 SET 列,该值将被忽略。 SET 以数字顺序排序。NULL 值排在非 NULL SET 值之前。 通常,可以使用 LIKE 操作符或 FIND_IN_SET() 函数执行在一个 SET 列上的 SELECT: mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
    mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;但是,下列示例也可以工作: mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';
    mysql> SELECT * FROM tbl_name WHERE set_col & 1;第一个语句寻找一个精确的匹配。第二个语句寻找包含第一个集合成员的值。 如果希望得到一个 SET 列的所有可能值,可以使用 SHOW COLUMNS FROM table_name LIKE set_column_name 并分析第二列的 SET 定义。