Использование пользовательских переменных
В MySQL для хранения результатов, чтобы не держать их во временных переменных на клиенте, можно применять пользовательские переменные (see section 6.1.4 Переменные пользователя).
Например, для того чтобы найти изделия с максимальной или минимальной ценой, можно выполнить следующие действия:
mysql> SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price;
+---------+--------+-------+ | article | dealer | price | +---------+--------+-------+ | 0003 | D | 1.25 | | 0004 | D | 19.95 | +---------+--------+-------+
Использование внешних ключей
В MySQL 3.23.44 и выше в таблицах InnoDB осуществляется проверка ограничений целостности внешних ключей (обратитесь к разделам section 7.5 Таблицы InnoDB и Внешние ключи).
Фактически для соединения двух таблиц внешние ключи не нужны.
Единственное, что MySQL в настоящее время не осуществляет (в типах таблиц, отличных от InnoDB ), это проверку (CHECK ) что ключи, которые вы используете, действительно существуют в таблице(ах) на которые вы ссылаетесь, и не удаляет автоматически записи из таблиц с определением внешних ключей. Если же ключи используются обычным образом, все будет работать просто чудесно:
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) );
CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM("t-shirt", "polo", "dress") NOT NULL, color ENUM("red", "blue", "orange", "white", "black") NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES persons, PRIMARY KEY (id) );
INSERT INTO person VALUES (NULL, "Antonio Paz");
INSERT INTO shirt VALUES (NULL, "polo", "blue", LAST_INSERT_ID()), (NULL, "dress", "white", LAST_INSERT_ID()), (NULL, "t-shirt", "blue", LAST_INSERT_ID());
INSERT INTO person VALUES (NULL, "Lilliana Angelovska");
INSERT INTO shirt VALUES (NULL, "dress", "orange", LAST_INSERT_ID()), (NULL, "polo", "red", LAST_INSERT_ID()), (NULL, "dress", "blue", LAST_INSERT_ID()), (NULL, "t-shirt", "white", LAST_INSERT_ID());
SELECT * FROM person;
+----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+
SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+
SELECT s.* FROM person p, shirt s WHERE p.name LIKE "Lilliana%" AND s.owner = p.id AND s.color <> "white";
+----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
1 2 3 4
8 8 8
|