-2

我有 2 张桌子:

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 的外部键。

升级版:

我想翻译 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

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

4

3 回答 3

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
于 2013-09-29T17:44:31.343 回答
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

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

于 2013-09-29T17:09:38.257 回答
0

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

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

于 2013-09-29T15:43:59.130 回答