Mysql - 具有空值的键

时间:2013-09-29 15:38:42

标签: mysql null

我有两张桌子:

news_item:
id | catagory_id
1 | 2
2 | 100
3 | 50
4 | 3


news_item_lang:
id | id_origin | lang | title
1 | 1 | en | This is title in english
2 | 1 | ru | This is title in russian
3 | 1 | fr | This is title in french
4 | 2 | NULL | This is multilanguage !!!!!!!!!!!!!!!! title
5 | 2 | en | ......       ---------------------- This is WRONG case, because we have row with id = 4 already, which says no needs in row with lang = 'en'.

那么,我怎么能确定我只有一行lang = NULL或每行语言多行?配对“id_origin - lang”是一个唯一的密钥。 id_origin是表news_item的外部键。

UPD:

我希望获得id = 1的新闻翻译。

翻译可以存在,因此对于每种语言(en,fr,ru ...),我可以使用Left Join news_item和news_item_lang进行翻译。但在某些情况下(id = 2)没有需要翻译,所以对于每种语言,我得到相同的行,字段lang = NULL。所以,翻译为html页面

/en/news/2.html
/ru/news/2.html
/fr/news/2.html

将与标题“这是多语言!!!!!!!!!!!!!!!!标题”相同。

3 个答案:

答案 0 :(得分:0)

NULL意味着不确定,这意味着你不知道它是什么。在这种情况下,代替NULL,对多种语言使用“mult”之类的东西,因为你知道它是多语言的。 NULL引入了很多麻烦,如果你不需要它,请不要使用它。

然后你可以将lang列设置为唯一,而不是接受空值,你就完成了!

答案 1 :(得分:0)

解决方案1 ​​

如果您的数据库与问题中的数据库相同,请尝试以下代码:

SELECT 
news_item_lang.id,
id_origin,lang,
title 
FROM news_item_lang
LEFT JOIN news_item ON  news_item.id = news_item_lang.id_origin
WHERE id_origin NOT IN (SELECT id_origin FROM  news_item_lang  WHERE lang is null)

UNION ALL 

SELECT news_item_lang.id,id_origin,lang,title FROM news_item_lang
LEFT JOIN news_item ON  news_item.id = news_item_lang.id_origin
WHERE lang is null

ORDER BY id

解决方案2

如果您只想阻止这样的数据,那么解决方案是您必须在使用应用程序语言(如PHP)插入之前检查数据库,并且可以使用以下查询:

 SELECT id_origin FROM  news_item_lang  WHERE lang is null

执行查询后,如果找到任何行,则不输入数据(否则输入)

答案 2 :(得分:0)

由于你想要停止它,你需要实现一个触发器(考虑这个伪代码)

CREATE TRIGGER trg_foobar 
BEFORE INSERT ON news_item_lang
FOR EACH ROW
BEGIN

IF  (new.lang IS NULL AND EXISTS(SELECT * FROM news_item_lang WHERE new.id_origin = news_item_lang.id_origin)) THEN
  SIGNAL 'Single Language already Exists'
END IF

IF (new.lang IS NOT NULL AND EXISTS(SELECT * FROM news_item_lang WHERE new.id_origin = news_item_lang.id_origin AND news_item_lang.lang IS NULL)) THEN 
  SIGNAL 'Multi Language already Exists'
END IF

END