Использование MySQL CHECK, чтобы убедиться, что значение в таблице совпадает с другой таблицей - PullRequest
0 голосов
/ 23 января 2012

Я хочу, чтобы одна из моих таблиц проверила правильность значений, введенных в одно из ее полей.

В моем случае у меня есть таблица с именем Book и таблица с названием Sale.Поскольку каждая продажа имеет номер книги, для меня должна быть возможность убедиться, что цена, введенная в таблицу продаж, соответствует цене, соответствующей значению isbn в таблице книг.Я убежден, что должен использовать ограничение CHECK в SQL, но я не знаю, как это сделать.

Родительская таблица:

CREATE TABLE Book
(
    isbn INTEGER NOT NULL,
    title VARCHAR(20),
    author VARCHAR(20),
    price DOUBLE,
    PRIMARY KEY (isbn)
);

Вставка в таблицу Book:

INSERT INTO Book
VALUES (1, 'A Separate Peace', 'John Knowles' 9.99);

Моя дочерняя таблица:

CREATE TABLE Sale
(
    date DATE,
    saleId INTEGER NOT NULL,
    isbn INTEGER,
    price DOUBLE,
    PRIMARY KEY (saleId),
    FOREIGN KEY (isbn) REFERENCES Book (isbn),
    CHECK (price = (Book (price) WHERE Book (isbn) = isbn))
);

Пример оператора INSERTДля продажи:

INSERT INTO Sale 
VALUES ('2012-01-01', 1234, 1, 8.99);

Обратите внимание, что правильная цена составляет 9,99, а не 8,99.Я хочу, чтобы эта ВСТАВКА возвращала ошибку.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Вы должны внедрить этот вид бизнес-логики в программную часть системы.

  • Как насчет того, когда вы хотели бы предложить скидку или когда товар выставлен на продажу?
  • Что если продажа, скажем, 1 годом ранее для Book1 была 9,99, а годом позже цена на ту же книгу изменится на 8,99?

Если вы этого не хотите, то нет необходимости дважды сохранять цену (в обеих таблицах), поэтому просто удалите столбец цен из таблицы Sales и используйте isbn no при чтении из базы данных, чтобы определить цена товара.

1 голос
/ 23 января 2012

Предполагается, что цены могут измениться, и вы хотите, чтобы текущие цены книг были в Book.price, тогда как цены, в которых книги продаются в Sale.price.

Чтобы обеспечить вставку цены в таблицу Sale текущая цена книги (хранится в Book), вместо:

INSERT INTO Sale 
  VALUES ('2012-01-01', 1234, 1, 8.99) ;

вы можете использовать что-то вроде этого:

INSERT INTO Sale 
  SELECT '2012-01-01', 1234, isbn, price
  FROM Book
  WHERE isbn = 1 ;
0 голосов
/ 23 января 2012

Да. Решение @ypercube достигнет того, что вы хотите, НО это идет вразрез с лучшими практиками и нормализацией базы данных .

Если бы это было так, то мы должны также добавить больше столбцов в таблицу продаж для имени, автора и т. Д.

Я предлагаю вам отделить бизнес-логику и сделать ее простой, если вы действительно не хотитедолжен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...