我有两张桌子:
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
将与标题“这是多语言!!!!!!!!!!!!!!!!标题”相同。
答案 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