Ответы пользователя по тегу SQL
  • Как реализовать внешний ключ в такой ситуации?

    zergon321
    @zergon321
    Сделать определение таблицы service_pay так:
    create table service_pay
    (
    service_id ...,
    transaction_id ... CHECK (transaction_id in (select id from transaction_table where type = ...)) #тип расходной транзакции
    foreign key (transaction_id) references transaction(id)
    );


    Или можно создать триггер на таблицу service_pay:
    DELIMITER //
    
    CREATE TRIGGER service_pay_bi
    BEFORE INSERT ON service_pay
    FOR EACH ROW
    BEGIN
    IF NEW.transaction_id IN (SELECT id FROM transaction_table WHERE type = ...) THEN #указать значение события дохода
    @last_error = "service_pay table can hold only the payment transactions";
    CALL non_existent(); #единственный способ прервать операцию
    END IF;
    END//


    А можно транзакции дохода и расхода хранить в разных таблицах, но в расходных добавить столбец service_id, тогда таблица service_pay не нужна. Если нужна выборка из всех транзакций - пользоваться UNION.
    SELECT ...
    FROM tbl_1
    UNION
    SELECT ...
    FROM tbl_2;
    Ответ написан
  • Правильно ли я спроектировал связь данных в БД?

    zergon321
    @zergon321
    Регионы - дисциплины и дисциплины - группы - судя по всему, от ношения многие ко многим (в одном регионе - множество дисциплин, но одна и та же дисциплина, футбол, например, может быть в нескольких регионах, так же и с группами). Сделайте так: дисциплины, регионы и группы - в отдельных таблицах, где есть только их id и названия. Четвертая таблица состоит из id региона, id дисциплины и id группы, а также id самой записи в 4-ой таблице. id записи из 4-ой таблицы - внешний ключ для записей в таблице матчей. Кстати, в вашем случае такая схема поможет сэкономить мно-о-о-о-о-го места на жестком диске сервера БД.
    Ответ написан
    9 комментариев
  • Как с помощью LOAD XML INFILE разобраться повторяющиеся теги и загнать их в Mysql?

    zergon321
    @zergon321
    Попробуйте процедуру со следующим кодом:
    DECLARE size INT UNSIGNED DEFAULT ExtractingValue(xml_file, "count(//item)");
    DECLARE counter INT UNSIGNED DEFAULT 1;
    
    WHILE counter <= size DO
        INSERT INTO your_table
        VALUES
        (
        ExtractValue(xml_file, "//item[$counter]/name"),
        ExtractValue(xml_file, "//item[$counter]/photo[1]"), #элементы нумеруются с 1, а не с 0; 
        ExtractValue(xml_file, "//item[$counter]/photo[2]") #и так для всех остальных фото
        );
        SET counter = counter + 1;
    END WHILE;
    Ответ написан
    Комментировать