sql >> データベース >  >> RDS >> Mysql

構文例を使用したCREATETABLEMySQL vs T-SQL

    あなたはMySQLの基礎を学んでいるT-SQL開発者ですか?次に、学習したいことの1つは、MySQLCREATETABLEステートメントです。さらに、新しいSQLデータベースプラットフォームを学ぶための最速の方法は、その一般的な機能と構文を比較することです。

    それが今日私たちがやろうとしていることです。しかし、完全な構文はたくさんあります。したがって、MySQLCREATETABLEコマンドを使用して実行するための5つの基本的なポイントのみを取り上げます。

    ただし、先に進む前に、いくつかの点を明確にしましょう。

    1. ここで使用されているMySQLバージョンは、InnoDBストレージエンジンを使用するMySQL8です。
    2. ここで使用されているSQLServerのバージョンはSQLServer2019です。

    いいですね?始めましょう。

    MySQLおよびT-SQLでテーブルステートメントを作成する

    テーブル名を定義して比較を始めましょう。

    MySQL CREATE TABLEの顕著な構文の違いの1つは、スキーマ名がないことです。方法は次のとおりです。

    CREATE TABLE database_name.table_name

    テーブル名の前にデータベース名が付いていることに気づきましたか?さて、これがあなたが精通しているT-SQLと同等のフォーマットです:

    
    CREATE TABLE database_name.schema_name.table_name
    
    

    なんで? MySQLでは、スキーマはデータベースと同義であるためです。データベース名とスキーマ名はオプションです。ただし、同じスクリプトで別のデータベースにテーブルを作成する必要がある場合は、これが必須です。

    それは正しい。テーブル名と列名に角かっこを使用すると、MySQLでエラーが発生します。代わりに、識別子を囲むためにバックティックのペアを使用する必要があります。図1は、米国のキーボードレイアウトのどこにあるかを示しています。

    さて、サンプルをチェックしてください:

    -- 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-SQLの同等のコードを確認してください:

    -- 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]
    

    もちろん、これらの識別子を囲む必要はありません。ただし、テーブル名または列名に予約語またはスペースを使用すると、エラーが発生します。

    方法 一時テーブルの作成

    一時的なテーブルが好きですか?次に、MySQLでは、さらに入力して一時テーブルを定義できます。サンプルをチェックしてください:

    -- MySQL Temporary Table
    
    CREATE TEMPORARY TABLE `MyTempTable`
    

    一方、T-SQLコーダーはに慣れています テーブル名の前の記号。上記の同等のコードを参照してください:

    
    -- T-SQL Temporary Table
    
    CREATE TABLE #MyTempTable
    

    テーブルの定義と名前はこれで完了です。列の定義に進みましょう。

    MySQL列構文

    列のない基本的なSQLテーブルを作成することはできません。では、MySQLとSQL Serverの間にはどのような類似点と相違点がありますか?

    列名とデータ型

    あなたはすでにバックティックについて知っています。列名とデータ型に関するその他の基本的なことは、MySQLとT-SQLで同じです。以下のサンプルを参照してください:

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

    ただし、それだけではありません。

    列の無効性

    列はnull許容である場合とそうでない場合があります。これを行うには、列定義にNULLまたはNOTNULLを追加します。

    前の例を拡張してみましょう。

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

    T-SQLとほとんど同じです。デフォルト値はどうですか?

    列のデフォルト値

    次は、列のデフォルト値です。これらは、レコードを挿入するときに便利ですが、列に特定の値を指定しませんでした。前の例をもう少し拡張してみましょう:

    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(),
         ...
    );
    

    ModifiedDate 列のデフォルトは、現在のシステムの日付と時刻です。以下のようにこのテーブルでINSERTを実行すると、 ModifiedDateの値が常に存在します。 。

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

    INSERT後は期待どおりに動作します。これがdbForgeStudioforMySQLのスクリーンショットです:

    MySQLは、プライマリキー、外部キー、および一意のキーを使用してテーブルを作成します

    他のSQLプラットフォームと同様に、MySQLの制約を使用してテーブル列データにルールを定義できます。これはテーブルの設計にとって重要なので、次の点を考慮する必要があります。

    T-SQL開発者は、MySQLの主キー、外部キー、および一意のキーに慣れている必要があります。

    主キー

    1つ以上の列を主キーとして定義できます。構文はSQLServerとほぼ同じです。例外はありますか?はい。これは、クラスター化インデックスと非クラスター化インデックスの使用です。ただし、これについては次のセクションで説明しておきましょう。

    今のところ、主キーの構文に焦点を当てます。これは以前と同じ例ですが、主キーとしてID列を追加しています:

    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()
    );
    

    簡単ですね。

    しかし、複数の列が必要な場合はどうでしょうか。 T-SQLと同様に、2つのオプションがあります。以下の例を確認してください:

    -- 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`)
    );
    

    主キーについては以上です。

    外部キー

    もう1つの重要な制約は、外部キーです。これは、テーブルを別のテーブルに相互参照するために使用されます:

    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`)
    );
    

    T-SQLとの類似点を見ましたか?

    一意のキー

    テーブルに挿入されたデータが一意であることを確認したい場合があります。 MySQLは一意のキーもサポートしています。次に例を示します:

    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`)
    
    );
    

    上記のコードにより、一意の名前のみがテーブルに追加されます。

    テーブルインデックスの例を作成する(クラスター化および非クラスター化)

    前の例では、プライマリキーとセカンダリキーが作成されているのを見てきました。しかし、クラスター化インデックスと非クラスター化インデックスはどこにありますか?これは、SQL ServerでキーワードCLUSTEREDを明示的に指定して、クラスター化されたインデックスを作成するためです。

    興味深いのは、MySQLにCLUSTEREDまたはNONCLUSTEREDキーワードがないことです。クラスタ化インデックスをどのように作成しますか?

    単純。列を主キーとして指定するだけで、InnoDBストレージエンジンがそれをクラスター化インデックスにします。次の例では、 ID 主キーであり、クラスター化されたインデックスです。

    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`)
    );
    

    主キーを指定しない場合、一意のインデックスがクラスター化インデックスとして使用されます。

    繰り返しになりますが、主キーと一意のインデックスがない場合、InnoDBは非表示のクラスター化インデックスを作成します。ここで証明を確認してください。

    次の質問は、非クラスター化インデックスはどうですか?

    クラスタ化されたインデックスとして主キーをすでに持っている場合、他のインデックスは非クラスタ化またはセカンダリになります。また、クラスター化されたインデックスは1つしか持つことができません。

    次のセクションでは、T-SQLにはないMySQLCREATETABLEの一意の構文について説明します。

    MySQLテーブルのクローン作成とコピーの構文

    テーブルのクローン作成について説明しましょう。 MySQLCREATETABLEでそれを行うことができます。次に、T-SQLに相当するものを示します。

    以下の例では、CREATETABLE…LIKEを使用して最初のテーブルと同じ構造のテーブルを作成します。

    CREATE TABLE `people2` LIKE `people`

    のクローンを作成しました people2へのテーブル 。ただし、それはの構造にすぎません。 データではなく、コピーされたテーブル。また、元のテーブルの主要な制約とインデックスをコピーしました。あなたが私に尋ねれば、非常に便利です。

    最も近いT-SQLの同等物はこれです:

    -- 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.
    

    しかし、データが必要な場合はどうでしょうか。次に、CREATETABLE…SELECTが答えです:

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

    にあるデータは何でも テーブルの場合、 people3にコピーされます テーブル。ただし、このコマンドにはインデックスと制約は含まれません。

    さて、最も近いT-SQLの同等物はこれです:

    -- T-SQL table copying
    
    SELECT * INTO people3 
    FROM people
    

    結論

    上記のポイントにより、SQLServerT-SQL開発者の観点からMySQLCREATETABLEを使用できるようになることを願っています。

    グラフィカルツールを使用することを好む人もいます。しかし、後で、ストアドプロシージャまたはアドホックスクリプトで作業テーブルを作成する必要があるときに、参照を探していることに気付くでしょう。または、すべてを入力して、より詳細な制御を求めるタイプです。いずれにせよ、基本的な構文を比較するワンストップショップは命の恩人になる可能性があります。

    この記事が気に入ったら、お気に入りのソーシャルメディアで自由に共有してください。

    みなさん、ハッピーコーディング。


    1. OracleのNLS_CHARSET_DECL_LEN()関数

    2. ODP.NET接続プーリング:接続が使用されたかどうかを確認する方法

    3. eコマースでのデータベースの使用方法

    4. 書評:Benjamin Nevarez:クエリの調整と最適化