AdoNetShop/database/02_create_tables.sql
2026-10-05 06:02:05 +05:00

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