2013-09-29 3 views
-2

У меня есть 2 таблицы:Mysql - ключ со значением нуль

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:

Я хочу, чтобы получить перевод новостей с ид = 1.

перевод может существует, поэтому для каждого из языков (EN, FR, о.е. ...) Я могу получить перевод Влево Присоединяйтесь к news_item и news_item_lang. Но в некоторых случаях (id = 2) нет необходимости в переводе, поэтому для каждого языка я получаю ту же строку с полем lang = NULL. Таким образом, перевод страницы HTML

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

будет то же самое с названием «Это многоязычная !!!!!!!!!!!!!!!! титул».

+0

вы ищете MySQL Query, чтобы узнать количество строк, которые содержат «NULL», или вы хотите, чтобы убедиться, что у вас есть только один 'значение NULL' во всей вашей БД? Во втором случае, прежде чем вставлять значения в БД, вы можете проверить свой дБ с помощью языка приложения, а затем вставить его. Если это решение не работает, можете ли вы объяснить, что именно вы хотите достичь? –

+0

Я хочу убедиться, что у меня есть только одно значение NULL в поле 'lang' с id = 2 OR !!! Я не подавал «lang» со значением NULL, но тогда у меня может быть поле «lang» со значениями en, ru, fr ... Один момент, я делаю некоторое обновление. – webprogrammer

+0

Вы пытаетесь остановить ввод данных (например, ID # 5)? Или вы хотите, чтобы сценарий SQL показывал, когда статья (например, статья # 2) имеет как многоязычный, так и один язык? – AgRizzo

ответ

0

NULL означает неопределенное, что означает, что вы не знаете, что это такое. В этом случае вместо NULL используйте что-то вроде «mult» для нескольких языков, так как вы знаете, что это многоязычный. NULL вводит много хлопот, и если вам это не нужно, не используйте его.

Тогда вы можете установить столбец lang, чтобы быть уникальным и не принимать значения null, и все готово!

+0

Bu Я все еще могу подать «lang» со значениями «en, ru, fr, ...», а также «mult». Значение «mult» не исключает значений «en, ru, fr, ...». Если у меня есть набор «en, ru, fr, ...» и «mult» - могу ли я как-то выбрать только строку с «mult»? – webprogrammer

+1

Думаю, я не понимаю, чего вы пытаетесь достичь. Можете ли вы объяснить больше? – richard

+0

Я не могу дублировать строки (id_origin - lang) «1-en», «1-ru», «1-fr», добавляя уникальный ключ в поля 'id_origin' и' lang'. Но когда у меня есть строки «2-en», «2-NULL» - это дубликат. Я выбираю строку, используя «ON id_origin = 2 AND (lang = 'здесь текущий lang, например en' OR lang IS NULL)". Я думал, что могу добавить новый ключ или что-то в этом роде, не проверяя дубликат на php. – webprogrammer

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 

После выполнения запроса, если любая строка найдена, то не вводите данные (в противном случае ввести)

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 
Смежные вопросы