sql >> Database teknologi >  >> RDS >> Mysql

MySQL Insert Command vs T-SQL Query Syntaks med eksempler

Udviklere er livslange studerende. At få ny viden så hurtigt som vi kan er altid vores koncert. Hvis du kommer fra T-SQL-lejren, hvad er den hurtigere måde at lære MySQL på? Ofte vil man gerne sammenligne syntakser. Sidste gang lærte du at oprette en tabel i MySQL. Vores dagens indlæg vil tage dig et skridt videre. Vi indsætter poster med MySQL INSERT.

Hvor nemt kan det være? Begge databaseplatforme bruger SQL, men vi ved, at begge disse databaseprodukter har deres få tilføjelser til standard SQL-syntaks. MySQL INSERT er ingen undtagelse.

Så hvis du er træt af at sammenligne referencer til MySQL og SQL Server, er i dag din heldige dag. Jeg har sammensat syntaksen og lavet sammenligningen for dig. Vi vil også have eksempler at tjekke ud. Endelig har vi endnu et gratis snydeark.

Nu, før vi dykker ind, kan du også få et GRATIS PDF-snydeark om denne artikel ved at udfylde tilmeldingsformularen nedenfor.

[sendpulse-form id="12097″]

Parat? Fantastisk!

MySQL INDSÆT I forespørgselssyntaks (tabelværdikonstruktører)

Men før vi dykker ned i detaljerne, lad os gøre et par ting klart:

  • MySQL-versionen, jeg bruger her, er 8.0.23, med InnoDB-lagringsmotoren.
  • SQL Server-versionen er 2019.

Lad os først prøve at indsætte én post i en tabel. Den grundlæggende syntaks ligner den for SQL Server. Men det er det, hvis du ikke inkluderer databasen og skemanavnet og ikke omslutter kolonnenavnene med backticks.

CREATE TABLE testdatabase.people
(`ID` int NOT NULL PRIMARY KEY,
 `Lastname` varchar(50) NOT NULL,
 `FirstName` varchar(50) NOT NULL,
 `MiddleName` varchar(50) NULL DEFAULT '',
 `Rank` varchar(20) NOT NULL,
 `Ship` varchar(50) NOT NULL,
 `ShipRegistry` varchar(20) NOT NULL,
 `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
  
INSERT INTO people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Angivelse af den faktiske placering af tabellen vil være lidt anderledes. Som jeg har angivet i dette indlæg, er en database synonymt med et skema i MySQL. Tjek den ændrede prøve nedenfor:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Har du bemærket fraværet af skemanavnet ovenfor?

I mellemtiden danner VALUES-sætningen ovenfor en tabelværdikonstruktør. På samme måde har SQL Server også den funktion.

Indsæt flere rækker i tabeller i MySQL

Lad os prøve at indsætte flere rækker.

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Ovenstående kode vil indsætte to poster ved hjælp af to tabelværdikonstruktører. Du kan også bruge udtryk i stedet for bogstavelige værdier. Eksemplet nedenfor bruger en underforespørgsel for hver kolonne:

CREATE TABLE testdatabase.people2 LIKE people;

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (5, (SELECT Lastname FROM people WHERE ID=5), 
           (SELECT Firstname FROM people WHERE ID=5), 
           (SELECT MiddleName FROM people WHERE ID=5),
           (SELECT `Rank` FROM people WHERE ID=5),
           (SELECT Ship FROM people WHERE ID=5),
           (SELECT ShipRegistry FROM people WHERE ID=5));

Underforespørgslerne ser overflødige ud i forespørgslen ovenfor. Men dette vil generere en fejl:

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
        `Ship`, `ShipRegistry` FROM people);    -- ERROR!

Tabelværdikonstruktøren forventer et bogstav eller et udtryk for hvert felt i kolonnelisten. Desuden returnerer underforespørgslerne i det foregående eksempel en enkelt række med én værdi, og det er gyldigt. Men SELECT-sætningen ovenfor vil udløse en fejl, fordi den returnerer flere rækker og kolonner.

En anden mulighed er at angive ROW-søgeordet som i eksemplet nedenfor:

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Men nøgleordet ROW i INSERT-sætningen understøttes ikke i SQL Server.

MySQL INSERT INTO med SELECT fra en anden tabel

Du kan tilføje poster til en tabel ved hjælp af SELECT-sætningen:

INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;

Som du kan se, er det det samme med T-SQL uden databasenavnet, skemanavnet og backtick-tegnet. Rang er i øvrigt et reserveret ord.

Derfor er backtick-tegnene, der omslutter ordet Rank, et must.

Du kan udtrykke det uden kolonnelisten. Du skal blot angive kolonnenavnene i samme rækkefølge som måltabellens kolonnearrangement.

TRUNCATE TABLE testdatabase.people2;

INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
FROM people;

SELECT * FROM testdatabase.people2

Se output nedenfor fra dbForge Studio til MySQL:

Lyder godt? Lad os udvide mere om emnet håndtering af kolonneværdier.

INSERT og tabeller kolonneværdier

Dette afsnit vil grave dybere ned i kolonneværdier, når du bruger MySQL INSERT. Der er fire af dem:

  • Unicode-værdier.
  • Standardværdier.
  • Brug af autoincrement.
  • Værdier fra de brugerdefinerede variabler.

Indsæt Unicode-streng

I T-SQL er du bekendt med at gå foran en strengværdi med N . Når du bruger det, antager SQL Serveren, at værdien er en Unicode-værdi. I MySQL behøver du det ikke.

Se eksemplet nedenfor:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Der er et par punkter at være opmærksom på:

  1. Brug af NVARCHAR til at oprette en tabel i MySQL 8 vil automatisk blive ændret til VARCHAR.
  2. Der er ingen grund til at sætte N foran Unicode-værdien , ligesom N’김지수’.
  3. Du skal redigere ovenstående kode lidt for at få den til at køre med succes i SQL Server.

Tjek resultatet nedenfor:

Her er den tilsvarende kode i T-SQL:

CREATE TABLE UnicodeNames
(ID int NOT NULL IDENTITY PRIMARY KEY,
 FullName nvarchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Prøv at fjerne 'N' fra en af ​​Unicode-værdierne ovenfor. Koden kører fint, men du tjekker outputtet nedenfor i SQL Server Management Studio:

Sådan indsætter du standardværdi i MySQL

Kolonnens standardværdier virker, når du indsætter en post uden at angive en værdi. Vi brugte det i det første eksempel ovenfor. Her er kolonnedefinitionen igen:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Kolonnen ModifiedDate standard til den aktuelle dato og klokkeslæt på serveren. Det er derfor, da vi gjorde dette:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Resultatet er dette:

Meget pæn og sparer på tastetryk. Den samme adfærd sker også i SQL Server.

I mellemtiden, hvis du vil gøre det eksplicit, skal du blot angive kolonnenavnet med værdien DEFAULT:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);

Det virker også i SQL Server med en lille ændring.

Der er en anden tid og tastetryksparer. Den har en kolonneværdi for autoincrement.

INDSÆT i AUTO_INCREMENT-kolonne

I stedet for at få den sidste heltalværdi på en tabel og tilføje 1, er det bedre at definere en autoincrement-kolonne. det er godt for primærnøgler. Det gjorde vi i Unicode-tabeleksemplet.

Her er en del af det igen:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

I mellemtiden bruger vi i SQL Server søgeordet IDENTITY i stedet for AUTO_INCREMENT.

Figur 2 afslører resultatet af at definere en autoincrement-kolonne. Heltalsværdierne blev genereret uden at angive det i INSERT-sætningen.

Brug af brugerdefinerede variabler til at angive kolonneværdier

En anden almindelig sag for indsættelse af poster i T-SQL er at anvende brugerdefinerede variabler til at indstille kolonneværdier. Det er nyttigt til at lave ad-hoc scripts og lagrede procedurer.

Men først kan man definere variabler i MySQL ved hjælp af SET. I modsætning til i SQL Server bruger du DECLARE. Tag et kig på eksemplet:

SET @stringValue = 'string value';
SET @numericValue = 1287;
SET @booleanValue = TRUE;
SET @dateValue = CURRENT_DATE();

CREATE TABLE IF NOT EXISTS TableDataTypeValues
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 stringValue varchar(50) NOT NULL,
 numericValue int NOT NULL,
 BooleanValue bit not NULL DEFAULT FALSE,
 dateValue date NULL);

INSERT INTO TableDataTypeValues
(stringValue, numericValue, BooleanValue, dateValue)
VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);

Som du kan se ovenfor, fungerer variablerne som udtryk for at udfylde kolonneværdierne i VALUES-sætningen.

Indsæt i midlertidig tabel i MySQL

Her gennemgår vi brugen af ​​MySQL INSERT i midlertidige tabeller. T-SQL-udviklere er bekendt med '# ’ symbol foran et midlertidigt tabelnavn. I MySQL oprettes midlertidige tabeller ved hjælp af CREATE TEMPORARY TABLE tabelnavn . Den har ikke '# ’ symbol. Derfor kan et midlertidigt tabelnavn blandt linjerne i dit script se ud som almindelige tabelnavne:

CREATE TEMPORARY TABLE tmpkpopgroup
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 GroupName varchar(50) NOT NULL,
 ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP());

INSERT INTO tmpkpopgroup
(GroupName)
VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET');

SELECT * FROM tmpkpopgroup
ORDER BY GroupName;

Med andre ord, indsættelse af poster i midlertidige tabeller ser det samme ud som almindelige tabeller.

Her er resultatet:

MySQL INSERT...PÅ DUBLIKAT NØGLEOPDATERING – Ikke-understøttet syntaks i T-SQL

Endelig har MySQL INSERT syntaks-tilfælde, der ikke understøttes i T-SQL. En af dem er INDSÆT ... PÅ DUBLIKAT NØLEOPDATERING. Hvad kan det gøre?

Når en tabel har en unik nøgle, og du tilfældigvis indsætter en værdi, der vil forårsage en duplikat, vil INSERT mislykkes. Men når du bruger INSERT...ON DUPLICATE KEY UPDATE, vil en opdatering af den eksisterende række ske i stedet. Fejlen opstår ikke.

Lad os sige, at vi har disse optegnelser i folket tabel:

Bemærk værdien af ​​skibsregistret indrammet i rødt, og hele den linje. Sagen er, at vi vil indsætte den samme post med ON DUPLICATE KEY UPDATE.

Lad os nu affyre udsagnet nedenfor:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';

SELECT * FROM testdatabase.people;

Er der en fejl? Lad os tjekke det!

Fedt, ikke?

Den samme effekt sker, når du gør dette:

UPDATE people 
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5

I mellemtiden kan du udtrykke hensigten i T-SQL sådan her:

IF EXISTS(SELECT id FROM people WHERE id = 5)
	UPDATE people 
	SET ShipRegistry = 'NCC-75633'
	WHERE ID = 5
ELSE
	INSERT INTO people
	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);

Det samme resultat vil forekomme.

Konklusion

Benjamin Franklin sagde engang:"En investering i viden betaler altid den bedste interesse." Jeg håber, at denne artikel vil betale sig for dig med tiden.

Lad os få en opsummering:

  1. Den grundlæggende MySQL INSERT-syntaks er næsten den samme i T-SQL bortset fra fraværet af skemanavnet og brugen af ​​backticks.
  2. Indsættelse af poster i MySQL fra en anden tabel er næsten det samme som i T-SQL.
  3. Kolonneværdier håndteres forskelligt i MySQL INSERT. Unicode-værdier er de mest bemærkelsesværdige. Syntaksen er også anderledes i brugen af ​​AUTO_INCREMENT.
  4. Indsættelse af poster i en midlertidig tabel i MySQL har en mindre forskel i T-SQL med '# ’ symbol.
  5. INDSÆT...PÅ DUBLIKAT NØGLEOPDATERING ser godt ud til at forkorte syntaksen for at undgå duplikerede fejl.

Jeg håber, at artiklen viste sig nyttig for dig, mens du lærer MySQL. Hvis du kan lide dette opslag, så del det på dine foretrukne sociale medieplatforme!


  1. Failover &Failback på Amazon RDS

  2. Enhedstest for PL/SQL

  3. SQL, hvordan man opdaterer en tabelstruktur

  4. Hvordan kan jeg kombinere flere rækker til en kommasepareret liste i Oracle?