Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

TẠO BẢNG MySQL và T-SQL với các ví dụ về cú pháp

Bạn có phải là nhà phát triển T-SQL đang tìm hiểu kiến ​​thức cơ bản về MySQL không? Sau đó, một trong những điều bạn có thể muốn học là câu lệnh BẢNG TẠO TẠO MySQL. Bên cạnh đó, cách nhanh nhất để học một nền tảng cơ sở dữ liệu SQL mới là so sánh chức năng và cú pháp chung của nó.

Đó là những gì chúng ta sẽ làm hôm nay. Nhưng cú pháp đầy đủ là rất nhiều. Vì vậy, chúng tôi sẽ chỉ trình bày 5 điểm cơ bản để giúp bạn bắt đầu và sử dụng lệnh MySQL CREATE TABLE.

Tuy nhiên, trước khi tiếp tục, hãy làm rõ một số điểm:

  1. Phiên bản MySQL được sử dụng ở đây là MySQL 8 sử dụng công cụ lưu trữ InnoDB.
  2. Phiên bản SQL Server được sử dụng ở đây là SQL Server 2019.

Nghe hay không? Hãy bắt đầu.

Tạo câu lệnh bảng trong MySQL và T-SQL

Hãy bắt đầu so sánh bằng cách xác định tên bảng.

Một trong những khác biệt về cú pháp đáng chú ý trong MySQL CREATE TABLE là không có tên lược đồ. Đây là cách nó diễn ra:

CREATE TABLE database_name.table_name

Bạn có nhận thấy tên bảng đứng trước tên cơ sở dữ liệu không? Bây giờ, đây là định dạng T-SQL tương đương mà bạn đã quen thuộc:


CREATE TABLE database_name.schema_name.table_name

Tại sao? Bởi vì trong MySQL, một lược đồ đồng nghĩa với một cơ sở dữ liệu. Cơ sở dữ liệu và tên lược đồ là tùy chọn. Tuy nhiên, nếu bạn cần tạo một bảng trong cơ sở dữ liệu khác trong cùng một tập lệnh, thì đây là điều bắt buộc.

Đúng rồi. Sử dụng dấu ngoặc vuông trong tên bảng và cột sẽ gây ra lỗi trong MySQL. Thay vào đó, bạn nên sử dụng một cặp dấu gạch ngược để bao gồm các số nhận dạng. Hình 1 cho thấy nơi bạn tìm thấy nó trên bố cục bàn phím Hoa Kỳ:

Bây giờ, hãy xem mẫu:

-- MySQL CREATE TABLE

CREATE TABLE `testdatabase`.`person` (
  `BusinessEntityID` INT NOT NULL,
  `PersonType` NCHAR(2) NOT NULL,
  `Title` VARCHAR(8) NULL,
  `FirstName` NVARCHAR(50) NOT NULL,
  `MiddleName` VARCHAR(50) NULL,
  `LastName` VARCHAR(50) NOT NULL,
  `Suffix` NVARCHAR(10) NULL,
  `EmailPromotion` INT NOT NULL,
  `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
  PRIMARY KEY (`BusinessEntityID`));

Từ mẫu mã ở trên, các mã nhận dạng tên bảng và cột được đặt trong dấu gạch ngược. Nếu bạn không quen với việc đặt tên bảng và cột bằng cái này, hãy tin tôi, bạn không đơn độc.

Kiểm tra mã tương đương trong T-SQL bên dưới:

-- T-SQL CREATE TABLE
CREATE TABLE [testdatabase].[dbo].[Person](
	[BusinessEntityID] [int] NOT NULL,
	[PersonType] [nchar](2) NOT NULL,
	[Title] [nvarchar](8) NULL,
	[FirstName] [nvarchar](50) NOT NULL,
	[MiddleName] [nvarchar](50) NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[Suffix] [nvarchar](10) NULL,
	[EmailPromotion] [int] NOT NULL,
	[ModifiedDate] [datetime] NOT NULL DEFAULT GETDATE(),
 CONSTRAINT [PK_Person_BusinessEntityID] PRIMARY KEY  
  (
	[BusinessEntityID] ASC
  )
) ON [PRIMARY]

Tất nhiên, bạn không cần phải đính kèm các số nhận dạng này. Nhưng nếu bạn sử dụng các từ hoặc khoảng trắng dành riêng trong tên bảng hoặc cột, thì sẽ xảy ra lỗi.

Cách thực hiện Tạo bảng tạm thời

Yêu thích các bảng tạm thời? Sau đó, MySQL sẽ cho phép bạn nhập nhiều hơn để xác định một bảng tạm thời. Kiểm tra mẫu:

-- MySQL Temporary Table

CREATE TEMPORARY TABLE `MyTempTable`

Trong khi đó, người viết mã T-SQL được sử dụng để # ký hiệu trước tên bảng. Xem mã tương đương ở trên:


-- T-SQL Temporary Table

CREATE TABLE #MyTempTable

Chúng ta đã hoàn thành các định nghĩa và tên bảng. Hãy tiếp tục với các định nghĩa cột.

Cú pháp cột MySQL

Bạn không thể có một bảng SQL cơ bản mà không có cột. Vậy, MySQL và SQL Server có những điểm giống và khác nhau nào?

Tên cột và kiểu dữ liệu

Bạn đã biết về backticks. Bất kỳ điều gì cơ bản khác về tên cột và kiểu dữ liệu đều giống nhau trong MySQL và T-SQL. Xem mẫu bên dưới:

CREATE TABLE `testdatabase`.`people`
(
    `ID` INT,
    `LastName` VARCHAR(50),
    ...
);

Tuy nhiên, còn nhiều hơn thế.

Tính vô hiệu của cột

Các cột có thể vô hiệu hoặc không. Bạn có thể làm điều đó bằng cách thêm NULL hoặc NOT NULL trong định nghĩa cột.

Hãy mở rộng ví dụ trước của chúng tôi.

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NULL,
     ...
);

Nó khá giống với T-SQL. Làm thế nào về các giá trị mặc định?

Giá trị mặc định của cột

Tiếp theo là các giá trị mặc định của cột. Những điều này rất hữu ích khi bạn chèn một bản ghi nhưng không chỉ định một giá trị cụ thể cho một cột. Hãy mở rộng ví dụ trước của chúng tôi thêm một số nữa:

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NULL,
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
     ...
);

Ngày sửa đổi cột mặc định là ngày và giờ hệ thống hiện tại. Nếu bạn thực hiện CHÈN trên bảng này như bảng bên dưới, sẽ luôn có giá trị cho Ngày sửa đổi .

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName)
VALUES
(1,'Kirk','James','Tiberius');

Nó hoạt động như mong đợi sau khi INSERT. Đây là ảnh chụp màn hình từ dbForge Studio cho MySQL:

MySQL Tạo bảng với các khóa chính, ngoại và duy nhất

Giống như trong bất kỳ nền tảng SQL nào, bạn có thể xác định các quy tắc trên dữ liệu cột của bảng bằng cách sử dụng các ràng buộc trong MySQL. Vì điều này quan trọng đối với thiết kế bảng, chúng ta cần xem xét điểm tiếp theo này.

Một nhà phát triển T-SQL sẽ cảm thấy thoải mái như ở nhà với khóa chính MySQL, khóa ngoại và khóa duy nhất.

Khóa chính

Bạn có thể xác định một hoặc nhiều cột làm khóa chính. Cú pháp gần giống như trong SQL Server. Có ngoại lệ nào không? Đúng. Đó là việc sử dụng các chỉ mục được phân cụm và không phân cụm. Nhưng chúng ta hãy dành phần thảo luận về vấn đề này trong phần tiếp theo.

Hiện tại, chúng tôi tập trung vào cú pháp của các khóa chính. Đây là ví dụ tương tự mà chúng tôi đã làm trước đó, nhưng chúng tôi thêm cột ID làm khóa chính:

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL PRIMARY KEY,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NULL,
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW()
);

Dễ dàng phải không?

Nhưng nếu bạn cần nhiều cột thì sao? Giống như trong T-SQL, bạn có 2 tùy chọn. Kiểm tra các ví dụ dưới đây:

-- OPTION 1: Let MySQL generate the constraint name

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
     PRIMARY KEY (`LastName`,`FirstName`,`MiddleName`)
);

-- OPTION 2: Specify your constraint name

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
    CONSTRAINT `pk_name` PRIMARY KEY (`LastName`, `FirstName`, `MiddleName`)
);

Đó là nó cho các khóa chính.

Khoá ngoại

Một hạn chế quan trọng khác là khóa ngoại. Điều này được sử dụng để tham chiếu chéo một bảng sang một bảng khác:

CREATE TABLE `testdatabase`.`address`
(
    `ID` int NOT NULL PRIMARY KEY,
    `parent_id` int NOT NULL,
    `full_address` varchar(100) NOT NULL,
    CONSTRAINT `FK_address_parent_id` FOREIGN KEY (`parent_id`)
    REFERENCES `people` (`ID`)
);

Bạn có thấy điểm tương đồng với T-SQL không?

Khóa duy nhất

Đôi khi, bạn muốn đảm bảo rằng dữ liệu được chèn vào bảng là duy nhất. MySQL cũng hỗ trợ các khóa duy nhất. Đây là một ví dụ:

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
    CONSTRAINT `PK_people_id` PRIMARY KEY (`ID`),
    CONSTRAINT `IDX_name` UNIQUE KEY (`LastName`,`FirstName`,`MiddleName`)

);

Đoạn mã trên sẽ đảm bảo rằng chỉ những tên duy nhất mới được thêm vào bảng.

Tạo Ví dụ về Chỉ mục Bảng (Nhóm và Không Nhóm)

Trong các ví dụ trước, bạn đã thấy các khóa chính và phụ được tạo. Nhưng đâu là chỉ mục được phân cụm và không được phân cụm? Điều đó đáng chú ý vì trong SQL Server, bạn chỉ định rõ ràng từ khóa CLUSTERED để tạo chỉ mục theo nhóm.

Phần thú vị là MySQL không có các từ khóa ĐƯỢC ĐIỀU CHỈNH hoặc KHÔNG ĐƯỢC ĐIỀU CHỈNH. Làm cách nào để bạn tạo các chỉ mục theo nhóm?

Giản dị. Chỉ cần chỉ định (các) cột làm khóa chính và công cụ lưu trữ InnoDB sẽ tạo chỉ mục đó thành một chỉ mục được phân nhóm. Trong ví dụ dưới đây, ID là khóa chính VÀ chỉ mục được phân nhóm.

CREATE TABLE `testdatabase`.`people`
(
     `ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
     `LastName` VARCHAR(50) NOT NULL,
     `FirstName` VARCHAR(50) NOT NULL,
     `MiddleName` VARCHAR(50) NOT NULL DEFAULT '',
     `ModifiedDate` DATETIME NOT NULL DEFAULT NOW(),
    CONSTRAINT `IDX_name` UNIQUE KEY (`LastName`,`FirstName`,`MiddleName`)
);

Nếu bạn không chỉ định khóa chính, bất kỳ chỉ mục duy nhất nào sẽ được sử dụng làm chỉ mục nhóm.

Sau đó, một lần nữa, nếu bạn không có khóa chính và chỉ mục duy nhất, thì InnoDB sẽ tạo một chỉ mục nhóm ẩn. Kiểm tra bằng chứng tại đây.

Câu hỏi tiếp theo là, làm thế nào về một chỉ mục không phân cụm?

Nếu bạn đã có khóa chính dưới dạng chỉ mục được phân nhóm, thì bất kỳ chỉ mục nào khác sẽ không được phân cụm hoặc phụ. Ngoài ra, bạn chỉ có thể có một chỉ mục theo nhóm.

Phần tiếp theo sẽ thảo luận về một cú pháp duy nhất cho MySQL CREATE TABLE không có trong T-SQL.

Cú pháp sao chép và sao chép bảng MySQL

Hãy thảo luận về việc sao chép bảng. Chúng ta có thể làm điều đó trong MySQL CREATE TABLE. Sau đó, chúng tôi sẽ hiển thị T-SQL tương đương.

Ví dụ dưới đây tạo bảng có cấu trúc giống như bảng đầu tiên bằng cách sử dụng CREATE TABLE… LIKE.

CREATE TABLE `people2` LIKE `people`

Chúng tôi vừa nhân bản người bảng thành people2 . Tuy nhiên, đó chỉ là cấu trúc của những người bảng đã được sao chép, không phải dữ liệu. Nó cũng sao chép các ràng buộc và chỉ mục chính của bảng gốc. Khá hữu ích, nếu bạn hỏi tôi.

T-SQL tương đương gần nhất là sau:

-- T-SQL way of cloning a table. The indexes & key constraints are not included, 
-- though

SELECT * INTO people2
FROM people
WHERE 1=0     -- this will cause the SELECT to return an empty result set.

Nhưng nếu bạn muốn dữ liệu thì sao? Sau đó, TẠO BẢNG… CHỌN là câu trả lời:

CREATE TABLE `people3` AS
SELECT * FROM `people`;

Bất kỳ dữ liệu nào có trong người bảng, nó sẽ được sao chép vào people3 bàn. Tuy nhiên, lệnh này sẽ không bao gồm các chỉ mục và ràng buộc.

Bây giờ, tương đương T-SQL gần nhất là sau:

-- T-SQL table copying

SELECT * INTO people3 
FROM people

Kết luận

Tôi hy vọng rằng những điểm trên có thể giúp bạn bắt đầu và sử dụng MySQL CREATE TABLE từ góc độ của một nhà phát triển SQL Server T-SQL.

Một số bạn sẽ thích sử dụng các công cụ đồ họa hơn. Nhưng sau này, bạn sẽ thấy mình đang tìm kiếm một tài liệu tham khảo khi bạn cần tạo các bảng công việc trong các thủ tục được lưu trữ của mình hoặc các tập lệnh đặc biệt. Hoặc bạn chỉ đơn giản là kiểu người tìm kiếm nhiều quyền kiểm soát hơn bằng cách nhập mọi thứ. Trong mọi trường hợp, một cửa hàng tổng hợp so sánh cú pháp cơ bản có thể là một cứu cánh.

Nếu bạn thích bài viết này, hãy chia sẻ nó trên phương tiện truyền thông xã hội yêu thích của bạn.

Chúc mọi người viết mã vui vẻ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL GROUP BY hành vi

  2. Tối ưu hóa hiệu suất truy vấn trong MySQL

  3. Cách lấy số ngày trong tháng trong MySQL

  4. Cách nhận bản ghi của tháng hiện tại trong MySQL

  5. So sánh Percona XtraBackup với MySQL Enterprise Backup:Phần một