Я создал базовую базу данных для коллекции винных энтузиастов. Я пытаюсь написать основную хранимую процедуру, которая заключается в добавлении вина в стол Wine.
Учитывая, что многие значения в Wineтаблица имеет ограничения внешнего ключа, мне нужно написать процедуру, которая выполняет эти задачи:
/ * Проверьте, есть ли тип и / или виноград уже в их соответствующих таблицах.Если не добавить его к типу и / или Grape * /
/ * Большинство людей при входе в хранилище не узнают locationID, они узнают номер стойки и cellID.Поэтому необходимо проверить номер стойки и cellID и вернуть привязку LocationID.с этим.Кроме того, обновите логическое значение StorageLocation.Empty, указав для этого местоположения значение false.* /
/ * Большинство людей не знают vintnerID, они просто знают vintnerName.Так что, если он существует в таблице Vintner, верните идентификатор Assoc.с ним, если не добавить его в Vintner и вернуть присвоенный ему идентификатор * /
/ * Большинство людей не будут знать OriginID, у них будет страна и, возможно, регион.Поэтому необходимо проверить, существует ли он в таблице источника и вернуть идентификатор ассоциации.с ним, а если не добавить его в Origin и вернуть присвоенный ему идентификатор * /
Это основные цели, которые я ставлю перед этим вопросом.Любые идеи и советы очень ценятся всем, кто хочет потратить время, чтобы помочь мне!Это моя первая база данных, так что я уверен, что есть явные структурные проблемы, я просто надеюсь, что если вы сможете объяснить необходимую логику и как ее решить, я смогу разобраться.Еще раз спасибо!
Скопируйте и вставьте все ниже этой точки:
DROP DATABASE IF EXISTS wino;
CREATE DATABASE IF NOT EXISTS wino CHARSET utf8 COLLATE utf8_unicode_ci;
USE wino;
CREATE TABLE Member
(
MemberID INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(25) NOT NULL,
LastName varchar(30) NOT NULL,
Address varchar(50) NULL,
City varchar(50) NULL,
StateID varchar(2) NULL,
Zip varchar(15) NOT NULL,
Phone varchar(15) NOT NULL
);
INSERT INTO MEMBER
(FirstName, LastName, Address, City, StateID, Zip, Phone)
VALUES('Guy', 'Faux', '1542 5th St', 'Monte Cristo', NULL, '8204931', '2-424-515-2412');
CREATE TABLE StorageLocation
(
LocationID INT AUTO_INCREMENT PRIMARY KEY,
LocationName varchar(30) NOT NULL,
RackNumber varchar(5) NOT NULL,
CellID varchar(5) NOT NULL,
Empty Boolean DEFAULT TRUE
);
CREATE UNIQUE INDEX rackNumberCellID
ON StorageLocation (RackNumber, CellID);
ALTER TABLE StorageLocation
ADD CONSTRAINT uq_LocationID UNIQUE(LocationName, RackNumber, cellID);
INSERT INTO StorageLocation
(LocationName, RackNumber, cellID)
VALUES
('Main','1', 'A1'),
('Main','1', 'A2'),
('Main','1', 'A3'),
('Main','1', 'A4'),
('Main','1', 'A5'),
('Main','1', 'B1'),
('Main','1', 'B2'),
('Main','1', 'B3'),
('Main','1', 'B4'),
('Main','1', 'B5'),
('Main','1', 'C1'),
('Main','1', 'C2'),
('Main','1', 'C3'),
('Main','1', 'C4'),
('Main','1', 'C5'),
('Main','1', 'D1'),
('Main','1', 'D2'),
('Main','1', 'D3'),
('Main','1', 'D4'),
('Main','1', 'D5'),
('Main','1', 'E1'),
('Main','1', 'E2'),
('Main','1', 'E3'),
('Main','1', 'E4'),
('Main','1', 'E5'),
('Main','1', 'F1'),
('Main','1', 'F2'),
('Main','1', 'F3'),
('Main','1', 'F4'),
('Main','1', 'F5'),
('Main','2', 'A1'),
('Main','2', 'A2'),
('Main','2', 'A3'),
('Main','2', 'A4'),
('Main','2', 'A5'),
('Main','2', 'A6'),
('Main','2', 'A7'),
('Main','2', 'A8'),
('Main','2', 'A9'),
('Main','2', 'B1'),
('Main','2', 'B2'),
('Main','2', 'B3'),
('Main','2', 'B4'),
('Main','2', 'B5'),
('Main','2', 'B6'),
('Main','2', 'B7'),
('Main','2', 'B8'),
('Main','2', 'B9'),
('Main','2', 'C1'),
('Main','2', 'C2'),
('Main','2', 'C3'),
('Main','2', 'C4'),
('Main','2', 'C5'),
('Main','2', 'C6'),
('Main','2', 'C7'),
('Main','2', 'C8'),
('Main','2', 'C9'),
('Main','2', 'D1'),
('Main','2', 'D2'),
('Main','2', 'D3'),
('Main','2', 'D4'),
('Main','2', 'D5'),
('Main','2', 'D6'),
('Main','2', 'D7'),
('Main','2', 'D8'),
('Main','2', 'D9'),
('Main','2', 'E1'),
('Main','2', 'E2'),
('Main','2', 'E3'),
('Main','2', 'E4'),
('Main','2', 'E5'),
('Main','2', 'E6'),
('Main','2', 'E7'),
('Main','2', 'E8'),
('Main','2', 'E9'),
('Main','2', 'F1'),
('Main','2', 'F2'),
('Main','2', 'F3'),
('Main','2', 'F4'),
('Main','2', 'F5'),
('Main','2', 'F6'),
('Main','2', 'F7'),
('Main','2', 'F8'),
('Main','2', 'F9'),
('Main','2', 'G1'),
('Main','2', 'G2'),
('Main','2', 'G3'),
('Main','2', 'G4'),
('Main','2', 'G5'),
('Main','2', 'G6'),
('Main','2', 'G7'),
('Main','2', 'G8'),
('Main','2', 'G9'),
('Main','2', 'H1'),
('Main','2', 'H2'),
('Main','2', 'H3'),
('Main','2', 'H4'),
('Main','2', 'H5'),
('Main','2', 'H6'),
('Main','2', 'H7'),
('Main','2', 'H8'),
('Main','2', 'H9'),
('Main','2', 'I1'),
('Main','2', 'I2'),
('Main','2', 'I3'),
('Main','2', 'I4'),
('Main','2', 'I5'),
('Main','2', 'I6'),
('Main','2', 'I7'),
('Main','2', 'I8'),
('Main','2', 'I9'),
('Main','2', 'J1'),
('Main','2', 'J2'),
('Main','2', 'J3'),
('Main','2', 'J4'),
('Main','2', 'J5'),
('Main','2', 'J6'),
('Main','2', 'J7'),
('Main','2', 'J8'),
('Main','2', 'J9'),
('Main','3', 'A1'),
('Main','3', 'A2'),
('Main','3', 'A3'),
('Main','3', 'A4'),
('Main','3', 'A5'),
('Main','3', 'A6'),
('Main','3', 'A7'),
('Main','3', 'A8'),
('Main','3', 'A9'),
('Main','3', 'B1'),
('Main','3', 'B2'),
('Main','3', 'B3'),
('Main','3', 'B4'),
('Main','3', 'B5'),
('Main','3', 'B6'),
('Main','3', 'B7'),
('Main','3', 'B8'),
('Main','3', 'B9'),
('Main','3', 'C1'),
('Main','3', 'C2'),
('Main','3', 'C3'),
('Main','3', 'C4'),
('Main','3', 'C5'),
('Main','3', 'C6'),
('Main','3', 'C7'),
('Main','3', 'C8'),
('Main','3', 'C9'),
('Main','3', 'D1'),
('Main','3', 'D2'),
('Main','3', 'D3'),
('Main','3', 'D4'),
('Main','3', 'D5'),
('Main','3', 'D6'),
('Main','3', 'D7'),
('Main','3', 'D8'),
('Main','3', 'D9'),
('Main','3', 'E1'),
('Main','3', 'E2'),
('Main','3', 'E3'),
('Main','3', 'E4'),
('Main','3', 'E5'),
('Main','3', 'E6'),
('Main','3', 'E7'),
('Main','3', 'E8'),
('Main','3', 'E9'),
('Main','3', 'F1'),
('Main','3', 'F2'),
('Main','3', 'F3'),
('Main','3', 'F4'),
('Main','3', 'F5'),
('Main','3', 'F6'),
('Main','3', 'F7'),
('Main','3', 'F8'),
('Main','3', 'F9'),
('Main','3', 'G1'),
('Main','3', 'G2'),
('Main','3', 'G3'),
('Main','3', 'G4'),
('Main','3', 'G5'),
('Main','3', 'G6'),
('Main','3', 'G7'),
('Main','3', 'G8'),
('Main','3', 'G9'),
('Main','3', 'H1'),
('Main','3', 'H2'),
('Main','3', 'H3'),
('Main','3', 'H4'),
('Main','3', 'H5'),
('Main','3', 'H6'),
('Main','3', 'H7'),
('Main','3', 'H8'),
('Main','3', 'H9'),
('Main','3', 'I1'),
('Main','3', 'I2'),
('Main','3', 'I3'),
('Main','3', 'I4'),
('Main','3', 'I5'),
('Main','3', 'I6'),
('Main','3', 'I7'),
('Main','3', 'I8'),
('Main','3', 'I9'),
('Main','3', 'J1'),
('Main','3', 'J2'),
('Main','3', 'J3'),
('Main','3', 'J4'),
('Main','3', 'J5'),
('Main','3', 'J6'),
('Main','3', 'J7'),
('Main','3', 'J8'),
('Main','3', 'J9'),
('Main','4', 'A1'),
('Main','4', 'A2'),
('Main','4', 'A3'),
('Main','4', 'A4'),
('Main','4', 'A5'),
('Main','4', 'A6'),
('Main','4', 'A7'),
('Main','4', 'A8'),
('Main','4', 'A9'),
('Main','4', 'B1'),
('Main','4', 'B2'),
('Main','4', 'B3'),
('Main','4', 'B4'),
('Main','4', 'B5'),
('Main','4', 'B6'),
('Main','4', 'B7'),
('Main','4', 'B8'),
('Main','4', 'B9'),
('Main','4', 'C1'),
('Main','4', 'C2'),
('Main','4', 'C3'),
('Main','4', 'C4'),
('Main','4', 'C5'),
('Main','4', 'C6'),
('Main','4', 'C7'),
('Main','4', 'C8'),
('Main','4', 'C9'),
('Main','4', 'D1'),
('Main','4', 'D2'),
('Main','4', 'D3'),
('Main','4', 'D4'),
('Main','4', 'D5'),
('Main','4', 'D6'),
('Main','4', 'D7'),
('Main','4', 'D8'),
('Main','4', 'D9'),
('Main','4', 'E1'),
('Main','4', 'E2'),
('Main','4', 'E3'),
('Main','4', 'E4'),
('Main','4', 'E5'),
('Main','4', 'E6'),
('Main','4', 'E7'),
('Main','4', 'E8'),
('Main','4', 'E9'),
('Main','4', 'F1'),
('Main','4', 'F2'),
('Main','4', 'F3'),
('Main','4', 'F4'),
('Main','4', 'F5'),
('Main','4', 'F6'),
('Main','4', 'F7'),
('Main','4', 'F8'),
('Main','4', 'F9'),
('Main','4', 'G1'),
('Main','4', 'G2'),
('Main','4', 'G3'),
('Main','4', 'G4'),
('Main','4', 'G5'),
('Main','4', 'G6'),
('Main','4', 'G7'),
('Main','4', 'G8'),
('Main','4', 'G9'),
('Main','4', 'H1'),
('Main','4', 'H2'),
('Main','4', 'H3'),
('Main','4', 'H4'),
('Main','4', 'H5'),
('Main','4', 'H6'),
('Main','4', 'H7'),
('Main','4', 'H8'),
('Main','4', 'H9');
CREATE TABLE Origin
(
OriginID INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
Country varchar(30) NOT NULL,
StateProvince varchar(30) NULL,
Region varchar(50) NULL,
Vineyard varchar(50) NULL
);
ALTER TABLE Origin
ADD CONSTRAINT uq_OriginID UNIQUE (Country, StateProvince, Region, Vineyard);
INSERT INTO Origin
(Country, StateProvince, Region, Vineyard)
VALUES
('United States', 'CA', 'Santa Rita Hills', 'Fiddlestix'),
('Spain', 'Northern Spain', 'Rioja', 'Campo Viejo'),
('United States', 'CA', 'Adelaida', 'Tablas Creek'),
('United States', 'CA', 'Napa Valley Carneros', 'M2 Carneros'),
('United States','CA', 'Napa Valley', NULL),
('United States','CA', 'Lodi Mokelumne River', 'Maley-Wegat'),
('Italy', 'Tuscany',NULL, NULL),
('Italy', 'Tuscany','Cortona', NULL),
('Spain', NULL,'Burgos', NULL),
('Italy', NULL, 'Montalcino', NULL);
CREATE TABLE Vintner
(
VintnerID INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
VintnerName varchar(50) UNIQUE NOT NULL,
YearEstablished YEAR NULL
);
INSERT INTO Vintner
(VintnerName, YearEstablished)
VALUES
('Fess Parker', 2016),
('Campo Viejo', 1964),
('Tablas Creek', NULL),
('M2', 2006),
('Lindeman', NULL),
('Renwood', NULL),
('Emilio Lustau', NULL),
('Robert Biale', NULL),
('Carpineto',NULL),
('Santa Christina', 1946),
('Ribera del Duero', NULL),
('Caparzo', NULL);
CREATE TABLE WineType
(
TypeName varchar(40) UNIQUE PRIMARY KEY
);
INSERT INTO WineType
(TypeName)
VALUES
('Pinot Noir'),
('Red Blend'),
('Vermentino'),
('Cream Sherry'),
('Chardonnay'),
('Port'),
('Rose'),
('Chenin Blanc'),
('White Blend'),
('Savignon Blanc'),
('Pecorino'),
('Prosecco'),
('Voigner'),
('Syrah'),
('Shiraz'),
('Petite Syrah'),
('Zinfandel'),
('Toscano'),
('Tempranillo'),
('Sangiovese');
CREATE TABLE Grape
(
GrapeName varchar(40) UNIQUE PRIMARY KEY
);
INSERT INTO Grape
(GrapeName)
VALUES
('Pinot Noir'),
('Tempranillo'),
('Vermentino'),
('Chardonnay'),
('Syrah'),
('Savignon Blanc'),
('Zinfandel'),
('Cabernet Sauvignon'),
('Voigner'),
('Grenache'),
('Sangiovese');
CREATE TABLE FoodType
(
FoodType varchar(40) UNIQUE PRIMARY KEY
);
INSERT INTO FoodType
(FoodType)
VALUES
('Fish'),
('Beef'),
('Pork'),
('Chicken'),
('Duck'),
('Lamb'),
('Italian'),
('Indian'),
('Asian'),
('Cheese');
CREATE TABLE Food
(
FoodName varchar(40) UNIQUE PRIMARY KEY
);
CREATE TABLE Wine
(
WineID INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
MemberID INT NOT NULL,
WineName varchar(40) NOT NULL,
TypeName varchar(40) NOT NULL,
GrapeName varchar(40) NULL,
VintnerID INT NOT NULL,
OriginID INT NOT NULL,
LocationID INT NOT NULL,
Vintage YEAR NULL,
Rating varchar(10) NULL,
BottleSize varchar(15) NULL DEFAULT '750ml',
ABV FLOAT NULL,
Price FLOAT NULL,
PurchasedFrom varchar(30) NULL,
DatePurchased DATE NULL,
DrinkByDate DATE NULL,
TastingNotes varchar(500) NULL,
Pairing varchar(40) NULL,
CONSTRAINT fk_typeName foreign key (TypeName)
REFERENCES WineType (typeName)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_grapeName foreign key (GrapeName)
REFERENCES Grape (grapeName)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_vintnerID foreign key (VintnerID)
REFERENCES Vintner (vintnerID)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_originID foreign key (OriginID)
REFERENCES Origin (originID)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_locationID foreign key (LocationID)
REFERENCES StorageLocation (LocationID)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_Pairing foreign key (Pairing)
REFERENCES FoodType (foodType)
ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT fk_MemberID foreign key (MemberID)
REFERENCES Member (memberID)
ON DELETE RESTRICT ON UPDATE CASCADE
);
INSERT INTO Wine
(WineName, TypeName, GrapeName, VintnerID, OriginID, LocationID,
Vintage, Rating, BottleSize, ABV, Price, PurchasedFrom, DatePurchased,
DrinkByDate, TastingNotes)
VALUES
('Fess Parker Pinot Noir', 'Pinot Noir', 'Pinot Noir', 1, 1, 214,
2016, NULL, DEFAULT, 14.3, NULL, NULL, NULL, NULL, NULL),
('Campo Viejo Rioja', 'Red Blend', 'Tempranillo', 2, 2, 142,
2013, NULL, DEFAULT, 13.5, 13, NULL, NULL, NULL, 'Aroma of wild cherries, pepper, and oak' ),
('Tablas Creek Vermentino', 'Vermentino', 'Vermentino', 3, 3, 119,
2016, NULL, DEFAULT, 12.9, NULL, NULL, NULL, NULL,
'The 2016 Vermentino has a classic
Vermentino nose of grapefruit pith, citrus leaf,
fresh herbs and sea spray, but with an extra level
of creaminess beyond what we usually see, like key lime pie.
The palate is zingy with flavors of lemon, nectarine,
and a briny mineral note that comes out on the long, clean, bright finish.
Drink now and over the next few years.'),
('M2 Pinot Noir los carneros','Pinot Noir', 'Pinot Noir', 4, 4, 182,
2015, NULL, DEFAULT, 13.8, NULL, NULL, NULL, NULL, NULL),
('Black Chicken', 'Zinfandel', 'Zinfandel', 8, 5, 126,
2015, NULL, DEFAULT, 14.8, 31, 'Vineria', '2018-05-01', NULL, NULL),
('M2 Zinfandel', 'Zinfandel', 'Zinfandel', 4, 6, 183,
2015, NULL, DEFAULT, 14.6, 25, 'M2 Wines', NULL, '2020-05-01', 'Peppery'),
('Dogajolo', 'Toscano', 'Sangiovese', 9, 7, 269,
2015, NULL, DEFAULT, 13, NULL, NULL, NULL, NULL,
'Fruity, intense, berries, coffee, vanilla and spice'),
('Santa Cristina Toscano', 'Toscano', 'Sangiovese', 10,8, 123,
2016, NULL, DEFAULT, 13, 15, 'Binnys', '2018-06-01', '2020-01-01',
'Ripe berry fruit, floral notes'),
('Valderiz', 'Tempranillo', 'Tempranillo', 11, 9, 245,
2014, NULL, DEFAULT, 15, NULL, NULL, NULL, NULL, NULL),
('Brunello di Montalcino', 'Sangiovese', 'Sangiovese', 12, 10, 261,
2012, NULL, DEFAULT, 14, NULL, NULL, NULL, NULL, NULL);
/* Is there an easier way to update StorageLocation.Empty for every entry in Wine? */
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 214;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 142;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 119;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 182;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 126;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 183;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 269;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 123;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 245;
UPDATE StorageLocation
SET Empty = FALSE
WHERE LocationID = 261;