Хранимая процедура добавления новой строки в таблицу, которая проверяет значения для проверки их значений во внешних таблицах - PullRequest
0 голосов
/ 09 декабря 2018

Я создал базовую базу данных для коллекции винных энтузиастов. Я пытаюсь написать основную хранимую процедуру, которая заключается в добавлении вина в стол 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;

1 Ответ

0 голосов
/ 09 декабря 2018

Хотя ваш пост содержит только один вопрос:

/ * Существует ли более простой способ обновить StorageLocation.Empty для каждой записи в Wine?* /

Да, не указывайте условие where:

UPDATE StorageLocation SET Empty = FALSE;

Другая вещь - это то, что стекопоток не обязательно предназначен для помощи;мы не говорим вам, как спроектировать или реализовать все функции приложения, мы помогаем вам преодолеть проблемы, с которыми вы столкнулись на этом пути.Тем не менее, инструкции, которые вы имеете, довольно специфичны и пригодны для информирования вас о конкретной модели программирования.Я дам несколько советов о том, как реализовать требуемые функции в общем смысле, но большая часть выбора дизайна и реализации остается за вами.Постарайтесь помнить, что никто здесь не для того, чтобы делать за вас домашнее задание, и вы всегда должны пытаться написать какой-то код, а затем опубликовать его, чтобы мы могли его увидеть - он не только показывает желание, но и помогает нам понять, как выПодумайте, что может иметь решающее значение для понимания того, с чем вы боретесьзначения идентификатора, используемые базой данных при поддержании ее отношений

Большинство людей не знают vintnerID, они просто знают vintnerName.Так что, если он существует в таблице Vintner, верните идентификатор Assoc.с ним, если не добавить его в Vintner и вернуть присвоенный ему идентификатор

Предполагается, что ваша хранимая процедура может выглядеть следующим образом:

CREATE STORED PROCEDURE blah (
  blah parameters, 
  vintnerName VARCHAR,
  more blah parameters
)
AS
BEGIN

  blah code

  DECLARE vintID INT;
  SELECT ID INTO vintID FROM vintners WHERE name = vintnerName;

  IF vintID IS NULL THEN
      SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Unknown vintner name';
  END IF;

  blahblah code...

END;
...