C# 学习笔记(17)操作SQL Server 上
C# 學習筆記(17)操作SQL Server上
安裝SQL Server
微軟官網 https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
如果不使用局域網訪問數據庫,安裝默認功能即可
安裝完畢后需要重啟電腦
啟動SQL Server
如果該服務沒有啟動,將其啟動
如果要通過局域網訪問數據庫,在安裝過程中,需要勾選多個擴展項(機器學習的可以不裝)
如果不使用局域網訪問數據庫,安裝默認功能即可
安裝完后需要開啟一下服務就可以通過局域網IP訪問數據庫了
創建數據庫
打開數據庫管理工具
創建數據庫
創建表
表可以通過腳本或者管理工具創建,不過一般用管理工具的UI就可以了
添加主鍵
就像是每個人都有一個唯一的身份證號一樣,每一行數據也要有一個唯一的編碼,不然怎么從數據庫中快速找到它。這個唯一的編碼也就是主鍵,通常是int類型(int類型的查找速度比較快),數據庫中每個表都必須要有主鍵。
主鍵就是一個唯一ID,如果每次輸入數據都要自己輸入這個ID,還要保證這個唯一,想想都麻煩。可以讓數據庫自己維護,添加數據時這個ID自動變化。
添加外鍵
數據庫在設計過程中為了減少數據冗余,設置了三大范式,三大范式個人理解其實就是將數據列和數據表設計為不可再劃分狀態,也就是最小狀態,這樣需要什么數據直接拿需要的表的需要的列進行組合即可。
假設要設計一個學校的數據庫,記錄學生信息和老師信息,學生和老師都有名字,性別,家庭住址,聯系方式等信息,在設計數據庫時,設計了如下五張表
-
學生信息表
-
老師信息表
-
城市信息表
-
省份信息表
-
性別表
-
年級表
什么是數據列不可再劃分?
可以看學生信息表和老師信息表中的地址列分為了兩列,城市和詳細地址。為什么要分兩列? -
后續有可能會用的城市信息,例如要統計每個城市學生人數等和城市相關的信息時,如果將地址信息做出一列數據,處理就比較麻煩
-
將可以重復利用的城市信息保存在城市信息表中,地址信息需要用的城市時,只要填城市的編號即可(查詢時可以通過城市編號找到對應城市),節省了存儲空間。
為什么不將地址繼續劃分?
當然可以繼續劃分,不過做的是學校師生信息數據庫,大學中人數有限,來自每個市的人數也不會不多(重復利用率不高,不會節省太多存儲控件),所以大概率不會用的市以下的地址信息,因此設計地址數據列時只劃分了省、市、詳細地址,如果要做一個居民信息數據庫,那就需要更進一步劃分了。當然了年紀表其實也可以再詳細劃分,專業-年紀-班級,這里為了簡單就沒有做劃分處理,其實最終是否劃分還是看設計需求,不過一般都會設計成最簡的列,方便后續增添需求
什么是數據表不可再劃分?
存在直接關系的放在一張表中,例如在學生信息表中,城市和省份是直接關聯的,學生地址存放城市信息即可,沒必要在多一個省份信息的列。學生和老師之間是通過班級聯系起來的,因此學生信息中不需要包含老師以及老師的信息,只需要包含班級信息即可,利用班級表可以找到對應的老師。
外鍵是什么?
為了節省存儲空間,多張表格相互關聯時會將一張表格的主鍵(下圖中城市信息表的id列)填到另一張表格的列(學生信息表的cityID)中,這樣每一條學生信息就可以不存儲城市名字(例如東城區),只填一個數字即可。但是如果向學生信息表中的cityID添加一個不存在的城市id,當查詢時就找不到對應的城市,為了避免學生信息表中存在不存在的城市id,在向學生信息表中添加cityID時,對cityID進行檢查,如果在城市信息表的id列中存在,才可以添加到學生信息表中,為了方便操作,數據庫定義了一個叫做外鍵的東西(外部表的主鍵)來幫我們自動做這個檢查。
如何建立外鍵
-
添加關系
-
設置外鍵
設置完外鍵后,再向學生信息表中的cityID列添加信息時就會自動檢索cityTable中的id列,如果存在才可以添加成功。同樣在刪除數據時,比如要刪除cityTable中的一個城市信息,則需要保證外鍵(學生信息表中cityID沒有使用對應的城市),否則不能刪除,需要先刪除學生信息表使用該城市的學生信息,然后才能刪除cityTable中的城市信息。其實還是為了確保學生信息表中cityID列中所有城市都可以在cityTable中查詢到。
五張表的創建腳本
USE [master] GO /****** Object: Database [TestDB] Script Date: 2021/7/23 18:29:26 ******/ CREATE DATABASE [TestDB]CONTAINMENT = NONEON PRIMARY ( NAME = N'TestDB', FILENAME = N'D:\SQL2019\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )LOG ON ( NAME = N'TestDB_log', FILENAME = N'D:\SQL2019\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )WITH CATALOG_COLLATION = DATABASE_DEFAULT GO ALTER DATABASE [TestDB] SET COMPATIBILITY_LEVEL = 150 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin EXEC [TestDB].[dbo].[sp_fulltext_database] @action = 'enable' end GO ALTER DATABASE [TestDB] SET ANSI_NULL_DEFAULT OFF GO ALTER DATABASE [TestDB] SET ANSI_NULLS OFF GO ALTER DATABASE [TestDB] SET ANSI_PADDING OFF GO ALTER DATABASE [TestDB] SET ANSI_WARNINGS OFF GO ALTER DATABASE [TestDB] SET ARITHABORT OFF GO ALTER DATABASE [TestDB] SET AUTO_CLOSE OFF GO ALTER DATABASE [TestDB] SET AUTO_SHRINK OFF GO ALTER DATABASE [TestDB] SET AUTO_UPDATE_STATISTICS ON GO ALTER DATABASE [TestDB] SET CURSOR_CLOSE_ON_COMMIT OFF GO ALTER DATABASE [TestDB] SET CURSOR_DEFAULT GLOBAL GO ALTER DATABASE [TestDB] SET CONCAT_NULL_YIELDS_NULL OFF GO ALTER DATABASE [TestDB] SET NUMERIC_ROUNDABORT OFF GO ALTER DATABASE [TestDB] SET QUOTED_IDENTIFIER OFF GO ALTER DATABASE [TestDB] SET RECURSIVE_TRIGGERS OFF GO ALTER DATABASE [TestDB] SET DISABLE_BROKER GO ALTER DATABASE [TestDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO ALTER DATABASE [TestDB] SET DATE_CORRELATION_OPTIMIZATION OFF GO ALTER DATABASE [TestDB] SET TRUSTWORTHY OFF GO ALTER DATABASE [TestDB] SET ALLOW_SNAPSHOT_ISOLATION OFF GO ALTER DATABASE [TestDB] SET PARAMETERIZATION SIMPLE GO ALTER DATABASE [TestDB] SET READ_COMMITTED_SNAPSHOT OFF GO ALTER DATABASE [TestDB] SET HONOR_BROKER_PRIORITY OFF GO ALTER DATABASE [TestDB] SET RECOVERY FULL GO ALTER DATABASE [TestDB] SET MULTI_USER GO ALTER DATABASE [TestDB] SET PAGE_VERIFY CHECKSUM GO ALTER DATABASE [TestDB] SET DB_CHAINING OFF GO ALTER DATABASE [TestDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO ALTER DATABASE [TestDB] SET TARGET_RECOVERY_TIME = 60 SECONDS GO ALTER DATABASE [TestDB] SET DELAYED_DURABILITY = DISABLED GO ALTER DATABASE [TestDB] SET ACCELERATED_DATABASE_RECOVERY = OFF GO EXEC sys.sp_db_vardecimal_storage_format N'TestDB', N'ON' GO ALTER DATABASE [TestDB] SET QUERY_STORE = OFF GO USE [TestDB] GO /****** Object: Table [dbo].[cityTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[cityTable]([id] [int] IDENTITY(1,1) NOT NULL,[provinceID] [int] NOT NULL,[cityName] [nvarchar](20) NOT NULL,CONSTRAINT [PK_cityTable] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[genderTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[genderTable]([id] [bit] NOT NULL,[name] [nchar](1) NOT NULL,CONSTRAINT [PK_genderTable] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[gradeTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[gradeTable]([id] [int] IDENTITY(1,1) NOT NULL,[name] [nvarchar](20) NOT NULL,[teacherID] [int] NOT NULL,CONSTRAINT [PK_gradeTable] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[provinceTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[provinceTable]([id] [int] IDENTITY(1,1) NOT NULL,[province] [nvarchar](10) NOT NULL,CONSTRAINT [PK_provinceTable] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[studentTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[studentTable]([id] [int] IDENTITY(1,1) NOT NULL,[name] [nvarchar](10) NOT NULL,[gender] [bit] NOT NULL,[cityID] [int] NOT NULL,[address] [nvarchar](50) NULL,[gradeID] [int] NOT NULL,CONSTRAINT [PK_studentTable] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[teacherTable] Script Date: 2021/7/23 18:29:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[teacherTable]([id] [int] IDENTITY(1,1) NOT NULL,[name] [nvarchar](10) NOT NULL,[gender] [bit] NOT NULL,[cityID] [int] NOT NULL,[address] [nvarchar](50) NULL,[phone] [char](11) NOT NULL,CONSTRAINT [PK_teacher] PRIMARY KEY CLUSTERED ([id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO SET IDENTITY_INSERT [dbo].[cityTable] ON GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (1, 1, N'東城區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (2, 1, N'西城區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (5, 1, N'崇文區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (7, 1, N'宣武區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (8, 1, N'朝陽區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (9, 1, N'豐臺區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (10, 1, N'石景山區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (11, 1, N'海淀區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (12, 1, N'門頭溝區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (13, 1, N'房山區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (14, 1, N'通州區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (15, 1, N'順義區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (16, 1, N'昌平區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (17, 1, N'大興區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (18, 1, N'懷柔區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (19, 1, N'平谷區') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (20, 1, N'密云縣') GO INSERT [dbo].[cityTable] ([id], [provinceID], [cityName]) VALUES (21, 1, N'延慶縣') GO SET IDENTITY_INSERT [dbo].[cityTable] OFF GO INSERT [dbo].[genderTable] ([id], [name]) VALUES (0, N'女') GO INSERT [dbo].[genderTable] ([id], [name]) VALUES (1, N'男') GO SET IDENTITY_INSERT [dbo].[gradeTable] ON GO INSERT [dbo].[gradeTable] ([id], [name], [teacherID]) VALUES (5, N'一年級一班', 3) GO INSERT [dbo].[gradeTable] ([id], [name], [teacherID]) VALUES (7, N'一年級二班', 4) GO INSERT [dbo].[gradeTable] ([id], [name], [teacherID]) VALUES (8, N'一年級三班', 5) GO SET IDENTITY_INSERT [dbo].[gradeTable] OFF GO SET IDENTITY_INSERT [dbo].[provinceTable] ON GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (1, N'北京') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (2, N'天津') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (3, N'河北') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (4, N'山西') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (5, N'內蒙古') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (6, N'遼寧') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (7, N'吉林') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (8, N'黑龍江') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (9, N'上海') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (10, N'江蘇') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (11, N'浙江') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (12, N'安徽') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (13, N'福建') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (14, N'江西') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (15, N'山東') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (16, N'河南') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (17, N'湖北') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (18, N'湖南') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (19, N'廣東') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (20, N'廣西') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (21, N'海南') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (22, N'重慶') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (23, N'四川') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (24, N'貴州') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (25, N'云南') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (26, N'西藏') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (27, N'陜西') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (28, N'甘肅') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (29, N'青海') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (30, N'寧夏') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (31, N'新疆') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (32, N'臺灣') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (33, N'香港') GO INSERT [dbo].[provinceTable] ([id], [province]) VALUES (34, N'澳門') GO SET IDENTITY_INSERT [dbo].[provinceTable] OFF GO SET IDENTITY_INSERT [dbo].[studentTable] ON GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (2, N'張三', 1, 1, N'xx街道', 5) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (3, N'李四', 0, 7, NULL, 5) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (4, N'王五', 1, 7, NULL, 5) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (5, N'趙六', 0, 8, NULL, 7) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (6, N'田七', 1, 7, NULL, 7) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (7, N'劉八', 0, 9, NULL, 5) GO INSERT [dbo].[studentTable] ([id], [name], [gender], [cityID], [address], [gradeID]) VALUES (8, N'錢九', 0, 7, NULL, 7) GO SET IDENTITY_INSERT [dbo].[studentTable] OFF GO SET IDENTITY_INSERT [dbo].[teacherTable] ON GO INSERT [dbo].[teacherTable] ([id], [name], [gender], [cityID], [address], [phone]) VALUES (3, N'老師1', 0, 1, N'xx街道', N'11111111111') GO INSERT [dbo].[teacherTable] ([id], [name], [gender], [cityID], [address], [phone]) VALUES (4, N'老師2', 0, 1, N'yy街道', N'22222222222') GO INSERT [dbo].[teacherTable] ([id], [name], [gender], [cityID], [address], [phone]) VALUES (5, N'老師3', 1, 1, N'xx街道', N'11111111112') GO SET IDENTITY_INSERT [dbo].[teacherTable] OFF GO ALTER TABLE [dbo].[cityTable] WITH CHECK ADD CONSTRAINT [FK_cityTable_provinceTable] FOREIGN KEY([provinceID]) REFERENCES [dbo].[provinceTable] ([id]) GO ALTER TABLE [dbo].[cityTable] CHECK CONSTRAINT [FK_cityTable_provinceTable] GO ALTER TABLE [dbo].[gradeTable] WITH CHECK ADD CONSTRAINT [FK_gradeTable_teacherTable] FOREIGN KEY([teacherID]) REFERENCES [dbo].[teacherTable] ([id]) GO ALTER TABLE [dbo].[gradeTable] CHECK CONSTRAINT [FK_gradeTable_teacherTable] GO ALTER TABLE [dbo].[studentTable] WITH CHECK ADD CONSTRAINT [FK_studentTable_cityTable] FOREIGN KEY([cityID]) REFERENCES [dbo].[cityTable] ([id]) GO ALTER TABLE [dbo].[studentTable] CHECK CONSTRAINT [FK_studentTable_cityTable] GO ALTER TABLE [dbo].[studentTable] WITH CHECK ADD CONSTRAINT [FK_studentTable_genderTable] FOREIGN KEY([gender]) REFERENCES [dbo].[genderTable] ([id]) GO ALTER TABLE [dbo].[studentTable] CHECK CONSTRAINT [FK_studentTable_genderTable] GO ALTER TABLE [dbo].[teacherTable] WITH CHECK ADD CONSTRAINT [FK_teacherTable_cityTable] FOREIGN KEY([cityID]) REFERENCES [dbo].[cityTable] ([id]) GO ALTER TABLE [dbo].[teacherTable] CHECK CONSTRAINT [FK_teacherTable_cityTable] GO ALTER TABLE [dbo].[teacherTable] WITH CHECK ADD CONSTRAINT [FK_teacherTable_genderTable] FOREIGN KEY([gender]) REFERENCES [dbo].[genderTable] ([id]) GO ALTER TABLE [dbo].[teacherTable] CHECK CONSTRAINT [FK_teacherTable_genderTable] GO USE [master] GO ALTER DATABASE [TestDB] SET READ_WRITE GO總結
以上是生活随笔為你收集整理的C# 学习笔记(17)操作SQL Server 上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本流程图
- 下一篇: C# 学习笔记(18)操作SQL Ser