86 lines
2.7 KiB
Transact-SQL
86 lines
2.7 KiB
Transact-SQL
-- 02_create_tables.sql
|
|
-- Скрипт для создания таблиц
|
|
|
|
USE [AdoNetShop];
|
|
GO
|
|
|
|
-- Таблица Categories
|
|
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Categories')
|
|
BEGIN
|
|
CREATE TABLE Categories (
|
|
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
Name NVARCHAR(100) NOT NULL
|
|
);
|
|
END
|
|
GO
|
|
|
|
-- Таблица Products
|
|
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Products')
|
|
BEGIN
|
|
CREATE TABLE Products (
|
|
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
Name NVARCHAR(200) NOT NULL,
|
|
Description NVARCHAR(MAX) NULL,
|
|
Price DECIMAL(18, 2) NOT NULL CHECK (Price > 0),
|
|
StockQuantity INT NOT NULL DEFAULT 0 CHECK (StockQuantity >= 0),
|
|
CategoryId INT NOT NULL,
|
|
FOREIGN KEY (CategoryId) REFERENCES Categories(Id)
|
|
);
|
|
END
|
|
GO
|
|
|
|
-- Таблица Customers
|
|
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Customers')
|
|
BEGIN
|
|
CREATE TABLE Customers (
|
|
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
Name NVARCHAR(100) NOT NULL,
|
|
Email NVARCHAR(100) NOT NULL UNIQUE,
|
|
Phone NVARCHAR(20) NULL
|
|
);
|
|
END
|
|
GO
|
|
|
|
-- Таблица Orders
|
|
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Orders')
|
|
BEGIN
|
|
CREATE TABLE Orders (
|
|
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
CustomerId INT NOT NULL,
|
|
OrderDate DATETIME2 NOT NULL DEFAULT GETDATE(),
|
|
Status NVARCHAR(50) NOT NULL DEFAULT 'New',
|
|
TotalAmount DECIMAL(18, 2) NOT NULL DEFAULT 0 CHECK (TotalAmount >= 0),
|
|
FOREIGN KEY (CustomerId) REFERENCES Customers(Id)
|
|
);
|
|
END
|
|
GO
|
|
|
|
-- Таблица OrderItems
|
|
IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'OrderItems')
|
|
BEGIN
|
|
CREATE TABLE OrderItems (
|
|
Id INT IDENTITY(1,1) PRIMARY KEY,
|
|
OrderId INT NOT NULL,
|
|
ProductId INT NOT NULL,
|
|
Quantity INT NOT NULL CHECK (Quantity > 0),
|
|
Price DECIMAL(18, 2) NOT NULL CHECK (Price > 0),
|
|
FOREIGN KEY (OrderId) REFERENCES Orders(Id) ON DELETE CASCADE,
|
|
FOREIGN KEY (ProductId) REFERENCES Products(Id)
|
|
);
|
|
END
|
|
GO
|
|
|
|
-- Индексы для внешних ключей (улучшают производительность JOIN'ов)
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Products_CategoryId')
|
|
CREATE INDEX IX_Products_CategoryId ON Products(CategoryId);
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Orders_CustomerId')
|
|
CREATE INDEX IX_Orders_CustomerId ON Orders(CustomerId);
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_OrderItems_OrderId')
|
|
CREATE INDEX IX_OrderItems_OrderId ON OrderItems(OrderId);
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_OrderItems_ProductId')
|
|
CREATE INDEX IX_OrderItems_ProductId ON OrderItems(ProductId);
|
|
GO
|