Jadvalni to'ldiradigan SQL server

  • SQL Serverda foizlarni, yutuqlarni va muvaffaqiyatsizliklarni hisoblashim uchun qanday qilib SELECT bayonotlarini birlashtira olaman?
  • SQL: ba'zi xususiyat qiymatlari asosida faqat alohida qatorlarni qanday tanlash kerak
  • Har bir toifadagi eng yuqori narxga ega mahsulotni qanday tanlash mumkin?
LevelId Min mahsuloti 1 x 1 2 y 1 3 z 1 4 a 1

Ma'lumotlar bazasida bir xil ma'lumotlarning nusxasini olishim kerak, faqat mahsulot identifikatorini 1 2,3… dan o'zgartirib. 40

LevelId Min mahsuloti 1 x 2 2 y 2 3 z 2 4 a 2

Men shunga o'xshash narsani qila olaman

INSERT INTO dbo.Levels SELECT top 4 * fROM dbo.Levels, lekin bu shunchaki ma'lumotlarni nusxa ko'chiradi. Ma'lumotni nusxalash va uni joylashtirish uchun faqatgina Mahsulot qiymatini o'zgartirib yuborishning biron bir usuli bormi?

Siz eng ko'p yo'ldasiz - yana bitta mantiqiy qadamni qo'yishingiz kerak:

INSERT INTO dbo.Levels (LevelID, Min, Product) LevelID, Min, 2 ni tanlang. Dbo.Levels dan Qaerda Mahsulot \u003d 1

... sizning qatorlaringizni boshqa mahsulot identifikatori bilan takrorlaydi.

Shuni ham unutmangki, QAYERDA Mahsulot \u003d 1 TOP 4 ga qaraganda ishonchli bo'ladi. Jadvalingizda to'rtdan ortiq qator bo'lsa, siz TOP 4 yana to'rtta qatorni qaytarishiga kafolat bera olmaysiz, agar siz ham buyurtmaga qo'shib buyurtma qo'shmasangiz, ammo Qaerda Mahsulot \u003d ... har doim bir xil bo'ladi va davom etadi Mahsulot identifikatori 1 bilan qo'shimcha qator qo'shsangiz ham ishlang (agar siz qo'shimcha qatorlarni qo'shsangiz, TOP 4 ni TOP 5 ga almashtirishni o'ylab ko'rishingiz kerak bo'ladi).

Siz mahsulot identifikatorini yaratishingiz va keyin uni quyidagilarga yuklashingiz mumkin:

< 40) INSERT INTO dbo.Levels(`min`, product) SELECT `min`, cte.n as product fROM dbo.Levels l cross join cte where l.productId = 1;

Bu LevelId identifikator ustuni bo'lib, u qo'shilishda avtomatik ravishda ko'paytiriladi. Agar unday bo'lmasa:

Cte as bilan (2 ni n birlashma sifatida tanlang, hammasi cte dan n + 1 ni tanlang, bu erda n< 40) INSERT INTO dbo.Levels(levelid, `min`, product) SELECT l.levelid+(cte.n-1)*4, `min`, cte.n as product fROM dbo.Levels l cross join cte where l.productId = 1;

Dbo.Levels-ga (LevelId, Min, Product) TOP 4 LevelId, Min, 2-ni tanlang.

Siz SELECTs-ga iboralarni yoki qattiq kodlangan qiymatlarni yoki Product + 1 kabi narsalarni yoki boshqa narsalarni kiritishingiz mumkin.

Ehtimol, siz LevelId-ni o'rnatishni xohlamaysiz, deb o'ylayman, lekin o'zingizning naqshingizga mos ravishda qoldiring. Agar bu faqat INSERT va SELECT bo'limlaridan o'chirilishini xohlamasangiz.

Masalan, raqamlar jadvalida CROSS JOIN dan foydalanishingiz mumkin.

L0 AS bilan (SELECT 1 AS C UNION TO SELECT 1 AS O), - 2 qator L1 AS (L0 to L0 from L0 to cross as LO AS LO AS L), - 4 qator Nums AS (SELECT ROW_NUMBER () over) (TARZI BILAN (SELECT NULL)) AS N FROM L1) SELECT lvl., Lvl., Num. [N] FROM dbo. lvl CROSS JOIN Nums num

Bu 4 marta takrorlanadi.

Bo'sh jadvallarni yaratgandan so'ng, keyingi mantiqiy qadam ularni ma'lumotlar bilan to'ldirish va ushbu ma'lumotlarni yangilashdir. Buning uchun Transact-SQL bir nechta bayonotlardan foydalanadi INSERT - Yangilash.

Biroq, ko'pincha dizaynning keyingi bosqichida jadval sxemasini o'zi o'zgartirish kerak bo'ladi. Masalan, ustunning asosiy kaliti yoki ma'lumotlar turi o'zgargan bo'lsa. Eski jadvallarni tashlamaslik va ularni to'g'ri parametrlar bilan CREATE TABLE yordamida qayta yaratmaslik uchun ALTER TABLE iborasi ishlatiladi. Ushbu uchta konstruktsiyaning qo'llanilishi quyida muhokama qilinadi.

Jadvallarni to'ldirish

Jadvalni ma'lumotlar bilan to'ldirish CREATE TABLE bandi orqali amalga oshirilishi mumkin, ammo yanada samarali yondashuv jadval yaratish va to'ldirishni ajratishdir, ayniqsa SQL-ga yangi kelganlar uchun, chunki:

  • ingl. aniqroq;
  • jadvallarni to'ldirish bosqichma-bosqich amalga oshirilsa, bu qulayroq.

Quyidagi jadval ko'rinishini olish uchun:

ID. Ijarachi

Tug'ilgan kun

Kvartira raqami

Elektron pochta manzili

Aleksin. V.V.

Gorbunov D.D.

[elektron pochta bilan himoyalangan]

Simonova K.R

Dormitotova K.S.

[elektron pochta bilan himoyalangan]

Siz uni yaratishingiz kerak bo'ladi JADVAL yarating va INSERT bayonotidan foydalanib to'ldiring. Quyidagi gap biz yaratgan uydoshlar jadvaliga bitta qator qo'shadi:

DROP TABLE uy xonadonlar jadvalining oldingi versiyasini tashlash; - Jadval yarating. CREATE TABLE uy uylari (housemeateID int NOT NULL CONSTRAINT basic_id PRIMARY KEY, housemateName nvarchar (30) NOT NULL, BithDate date NOT NULL, apartmentnumber int NOT NULL, Email nvarchar (30)); - Biz ma'lumotlarni USE GO INSERT INTO (,,,,) VALUES (100, "Aleksin V.V.", "19721122", 11, ") jadvaliga kiritamiz. [elektron pochta bilan himoyalangan]"), (101," Gorbunov D.D. "," 19220525 ", 25," [elektron pochta bilan himoyalangan]"), (102," Simonova K.R "," 19560211 ", 13," [elektron pochta bilan himoyalangan]"), (103," Dormitotova KS. "," 19770815 ", 9," [elektron pochta bilan himoyalangan]")

Yuqoridagi misolda ikkita INSERT blokini ajratish kerak:

ICHIGA - ma'lumotlar qo'shilgan jadvalga ishora qilish

QIYMATLAR - qatorni kiritishni boshlash.

Blokning parametrlarida (qavs ichida) ICHIGA ustunlarni paydo bo'lish tartibida ro'yxatlaydi. Jadvalni yaratishda va uni to'ldirishda ustunlar tartibi bir xil bo'lsa, parametrlarsiz yozishga ruxsat beriladi. Quyidagi kod oldingi kod bilan bir xil:

QIMMATLARGA KIRISH (100, "Aleksin. V.V.", "19721122", 11, " [elektron pochta bilan himoyalangan]"), (101," Gorbunov D.D. "," 19220525 ", 25," [elektron pochta bilan himoyalangan]"), (102," Simonova K.R "," 19560211 ", 13," [elektron pochta bilan himoyalangan]"), (103," Dormitotova KS. "," 19770815 ", 9," [elektron pochta bilan himoyalangan]")

Agar to'ldirish tartibini o'zgartirish zarur bo'lsa, unda bu aniq ko'rsatilishi kerak:

INSERT INTO (,,,,) QADRIYATLAR ("Aleksin. V.V.", 101, "19721122", " [elektron pochta bilan himoyalangan]", 11), (" Gorbunov D.D. ", 102," 19220525 "," [elektron pochta bilan himoyalangan]", 25), (" Simonova K.R ", 103," 19560211 "," [elektron pochta bilan himoyalangan]", 13) (" Dormitotova KS. ", 104," 19770815 "," [elektron pochta bilan himoyalangan]",9)

VALUES bloki INTO blok ustunlari tartibida satrma-satr boshlanishni amalga oshiradi. Line padding - qavs ichidagi katak qiymatlari ro'yxati. Qadriyatlar vergul bilan ajratilgan bo'lib, ular orasidagi chiziqlar ham mavjud.

Siz hali ma'lumotlarga ega bo'lmagan ustunlarga faqat INSERT qilishingiz mumkin. Aks holda, so'rov bajarilmaydi.

Jadval yangilanmoqda

Jadvalga kiritilgan ma'lumotlarni o'zgartirish kerak bo'lsa, jadvallarni yangilash zarurati paydo bo'ladi. Ko'rsatmalar yordamida bajarildi YANGILASH... Agar INSERT faqat bo'sh jadvallar bilan ishlasa, u holda faqat to'ldirilganlar bilan UPDATE qiling. Agar so'rov bo'sh katakchalarga yuborilsa, xato bo'ladi.

Quyidagi kod uyning rezidentiga 103 raqamiga ega bo'lgan yangi pochta qutisini tayinlaydi.

UPDATE uy-joylari SET Email \u003d " [elektron pochta bilan himoyalangan]"Qaerda uy ishi ID \u003d 103

Bloklash O'rnatish o'zgarishlar bloki. Agar sizga bir nechta kataklarning qiymatini yangilash kerak bo'lsa, ular vergul bilan ajratilgan holda ro'yxatga olinadi.

UPDATE uy-joylari SET Email \u003d " [elektron pochta bilan himoyalangan]", housemateName \u003d" Rurik S.S. "Qaerda housemeateID \u003d 103

Jadvalni o'zgartirish

Loyihalashning keyingi bosqichlarida yoki bazani ishlab chiqqandan so'ng, ko'pincha quyidagilar zarur:

  • ustun qo'shish yoki olib tashlash;
  • ustun turini o'zgartirish;
  • ustun yoki ustunlar guruhini asosiy yoki tashqi kalit sifatida belgilash yoki ushbu cheklovlarni olib tashlash.

Ushbu operatsiyalarning barchasida bekor qilish bayonoti mavjud ATER JADVALI.

Ustunni qo'shish uchun ALTER TABLE buyrug'i ADD bandi bilan ishlatiladi. Oldingi qismdan uylar jadvaliga yangi ustun qo'shaylik:

ALTER TABLE uydagilari ADD PhoneNumber nvarchar (12) NULL;

Unga jumla qo'llashingiz kerak KOLONNI ALTER ALTER TABLE ichida:

ALTER TABLE uylari ALTER COLUMN PhoneNumber char (25) NOT NULL;

Arizani qo'llash orqali ustunni o'chirish YO'Q BO'LING ALTER TABLE ichida:

ALTER TABLE uy a'zolari DROP COLUMN PhoneNumber;

Asosiy yoki chet el tugmachasi mos ravishda ALTER TABLE ADD CONSTRAINT / DROP CONSTRAINT konstruktsiyalari tomonidan olib tashlanadi va qo'shiladi:

Uy tugmachasi ustunidan asosiy kalit cheklovini olib tashlash ALTER TABLE uy xonalari DROP CONSTRAINT basic_id; --HusemeateID ustunini asosiy kalit sifatida belgilash ALTER TABLE uy xonalari ADD CONSTRAINT PK_ID PRIMARY KEY (housemeateID);

Agar siz allaqachon mavjud bo'lgan jadvalga asosiy kalitni tayinlamoqchi bo'lsangiz, so'rov tarjimoni xatolikni qaytaradi. Shuning uchun, agar jadvalda allaqachon asosiy kalit mavjud bo'lsa, uni tashlab, ustunlar guruhini asosiy kalit sifatida belgilashingiz kerak. Masalan, shunga o'xshash:

ALTER TABLE uylari DROP CONSTRAINT PK_ID; ALTER TABLE uy binolari ADD CONSTRAINT PK_ID, PK_AN PRIMARY KEY (housemeateID, kvartiralar raqami);

Ma'lumotlar bazalari bilan ishlash jadvallarni va ulardagi ma'lumotlarni o'zgartirish bilan bevosita bog'liqdir. Ammo amallarni boshlashdan oldin jadvallarni yaratish kerak. Ushbu jarayonni avtomatlashtirish uchun maxsus - "CREATE TABLE" mavjud.

Birinchi narsa!

MS SQL buyrug'i yordamida jadvallarni yaratish jarayoni bilan shug'ullanishdan oldin "CREATE TABLE", funktsiyani ishlatishdan oldin bilishingiz kerak bo'lgan narsalar haqida to'xtalishingiz kerak.

Avvalo, jadval uchun nom topishingiz kerak - ma'lumotlar bazasidagi boshqalar bilan taqqoslaganda u noyob bo'lishi va bir nechta qoidalarga amal qilishi kerak. Ism (a-z) harfi bilan boshlanishi kerak, shundan so'ng har qanday harflar, raqamlar va pastki chiziqlar ketma-ket kelishi mumkin va natijada olingan ibora zaxira so'z bo'lmasligi kerak. Jadval nomining uzunligi 18 belgidan oshmasligi kerak.

Ismga qaror qilib, siz tuzilmani ishlab chiqishingiz kerak: ustunlar nomlarini toping, ularda ishlatiladigan ma'lumotlar turini va qaysi maydonlarni to'ldirish kerakligini o'ylab ko'ring. Bu erda darhol xorijiy va asosiy kalitlarning maydonlarini, shuningdek ma'lumotlar qiymatlari uchun mumkin bo'lgan cheklovlarni aniqlashga arziydi.

Jadvalning qolgan nuanslarini osongina tuzatish mumkin, shuning uchun jadvalni yaratish bosqichida ular to'liq o'ylanmagan bo'lishi mumkin.

Sintaksis

Jadvalning tuzilishini ishlab chiqib, uni yaratishga o'tishingiz mumkin. Buni "CREATE TABLE" SQL funktsiyasidan foydalangan holda bajarish juda oson. Unda foydalanuvchi jadval nomini va ularning har biri uchun turi va nomini ko'rsatib, ilgari ixtiro qilingan ustunlar ro'yxatini ko'rsatishi kerak. Funktsiya sintaksisi quyidagicha:

Jadval jadvalining nomini yarating
((column_name ma'lumotlar turi ... | table_constraint)
[, (column_name ma'lumotlar turi ... | table_constraint)] ...)

Funktsiya konstruktsiyasida ishlatiladigan argumentlar quyidagilarni anglatadi:

  • table_name - jadval nomi
  • column_name - ustun nomi
  • ma'lumotlar turi - bu sohada ishlatiladigan ma'lumotlar turi
  • DEFAULT - bu ustunda ishlatiladigan standart ibora.

Yana ikkita funktsiya argumentidan foydalanish mumkin:

  • colum_constraint - ustun parametrlari
  • table_constraint - jadval parametrlari

Ularda foydalanuvchi jadvalni to'ldirish uchun ishlash uchun zarur bo'lgan cheklovlarni yoki shartlarni belgilashi mumkin.

Jadvallarni yaratish xususiyatlari

So'zni funktsiya bilan yozishda ba'zida maydonlarni to'ldirish qoidalarini belgilash kerak bo'ladi. Buning uchun ma'lum bir shartlar to'plamini belgilaydigan funktsiyaning maxsus atributlarini qo'shishingiz kerak.

Hujayrada bo'sh qiymat bo'lishi mumkinligini aniqlash uchun, ustun nomi va turini ko'rsatgandan so'ng, kalit so'zlardan birini yozish kerak: NULL (bo'sh qiymatlar bo'lishi mumkin) yoki NOT NULL (maydonni to'ldirish kerak).

Jadval yaratishda, aksariyat hollarda, ikkitasi bir xil bo'lishiga yo'l qo'ymaslik uchun har bir yozuvni birlashtirish kerak. Buning uchun ko'pincha raqamlarni raqamlash ishlatiladi. Va foydalanuvchidan jadvaldagi so'nggi raqamni bilishini talab qilmaslik uchun "JADVALNI YARATISH" funktsiyasida tegishli maydondan keyin "Asosiy kalit" kalit so'zini yozish orqali asosiy kalit ustunini ko'rsatish kifoya. Ko'pincha, jadvallar birlashtirilgan asosiy kalit orqali amalga oshiriladi.

Boshlang'ich kalit bilan birlashishni ta'minlash uchun "FOREIGN KEY" tashqi kalit xususiyati ishlatiladi. Ushbu xususiyatni ustun uchun ko'rsatib, ushbu maydonda bir xil yoki boshqa jadvalning asosiy kalit ustunidagi biriga mos keladigan qiymat mavjudligiga ishonch hosil qilishingiz mumkin. Shu tarzda ma'lumotlarning izchilligini ta'minlash mumkin.

CHECK atributidan berilgan to'plam yoki ta'rifga qarshi tekshiruvni ta'minlash uchun foydalanish kerak. U funktsiya argumentlari ro'yxatida oxirgi marta yozilgan va shaxsiy parametr sifatida ba'zi mantiqiy ifodalarga ega. U mumkin bo'lgan qiymatlar ro'yxatini cheklash uchun ishlatilishi mumkin, masalan, "Jins" jadval maydonidagi faqat "M" va "J" harflaridan foydalangan holda.

Taqdim etilganlardan tashqari, funktsiya o'ziga xos xususiyatlarga ega, ammo ular amalda juda kam qo'llaniladi.

Misollari

Funktsiya printsipini to'liq tushunish uchun amalda CREATE TABLE (SQL) qanday ishlashini ko'rib chiqishga arziydi. Quyidagi misol rasmda ko'rsatilgan jadvalni yaratadi:

Jadvalni maxsus qilib yarating
(ID CHAR (10) NULL EMAS Birlamchi kalit,
Custom_name CHAR (20),
Custom_adress CHAR (30),
Custom_city CHAR (20),
Custom_Country CHAR (20),
ArcDate CHAR (20))

Ko'rib turganingizdek, hujayradagi qiymat yo'qligi parametrini (NULL) chiqarib tashlash mumkin, chunki u sukut bo'yicha ishlatiladi.

SQL - 3-dars. Jadvallar yaratish va ularni ma'lumotlar bilan to'ldirish

Shunday qilib, biz ma'lumotlar turlari bilan tanishdik, endi forumimiz jadvallarini yaxshilaymiz. Keling, avval ularni buzib tashlaymiz. Va foydalanuvchilar jadvalidan boshlaylik. Unda 4 ta ustunimiz bor:

Id_user - tamsayı qiymatlari, shuning uchun turi int bo'ladi, keling, uni 10 ta belgi bilan cheklaymiz - int (10).
nomi varchar satrining qiymati, keling, uni 20 ta belgi bilan cheklaylik - varchar (20).
elektron pochta varchar satrining qiymati, keling, uni 50 ta belgigacha cheklaymiz - varchar (50).
parol - bu varchar satrining qiymati, keling, uni 15 ta belgi bilan cheklaymiz - varchar (15).

Barcha maydon qiymatlari talab qilinadi, shuning uchun NOT NULL turini qo'shishingiz kerak.

Id_user int (10) NULL emas
nomi varchar (20) NULL emas
elektron pochta varchar (50) NULL EMAS

Birinchi ustun, ma'lumotlar bazamizning kontseptual modelidan eslayotganingizdek, asosiy kalit (ya'ni uning qiymatlari noyobdir va ular yozuvni noyob tarzda aniqlaydi). O'ziga xoslikni kuzatib borishingiz mumkin, ammo oqilona emas. Buning uchun SQL maxsus atributga ega - AUTO_INCREMENT, ma'lumotlar qo'shish uchun jadvalga kirishda ushbu ustunning maksimal qiymatini hisoblab chiqadi, natijada olingan qiymatni 1 ga oshiradi va uni ustunga kiritadi. Shunday qilib, ushbu ustunda noyob raqam avtomatik ravishda hosil bo'ladi va shuning uchun NOT NULL turi ortiqcha bo'ladi. Shunday qilib, ustunga atributni asosiy kalit bilan belgilaylik:


nomi varchar (20) NULL emas
elektron pochta varchar (50) NULL EMAS
parol varchar (15) NULL EMAS

Endi id_user maydoni asosiy kalit ekanligini ko'rsatishingiz kerak. Buning uchun SQL kalit so'zdan foydalanadi Boshlang'ich kalit (), kalit maydon nomi qavs ichida ko'rsatilgan. O'zgarishlar qilaylik:

Id_user int (10) AUTO_INCREMENT
nomi varchar (20) NULL emas
elektron pochta varchar (50) NULL EMAS
parol varchar (15) NULL EMAS
ASOSIY KEY (id_user)

Shunday qilib, jadval tayyor va uning oxirgi versiyasi quyidagicha:

Jadval foydalanuvchilari yaratish (
id_user int (10) AUTO_INCREMENT,
nomi varchar (20) NULL emas,
elektron pochta varchar (50) NULL emas,
parol varchar (15) NULL emas,
ASOSIY KEY (id_user)
);

Endi ikkinchi jadvalni, mavzularni ko'rib chiqamiz. Xuddi shunday bahslashib, bizda quyidagi maydonlar mavjud:



id_author int (10) NULL emas
ASOSIY KEY (id_topic)

Ammo ma'lumotlar bazasi modelimizda id_author maydoni chet el kalitidir, ya'ni. u faqat foydalanuvchilar jadvalining id_user maydonida joylashgan qiymatlarga ega bo'lishi mumkin. Buni SQL-da ko'rsatish uchun kalit so'z mavjud Tashqi kalit ()quyidagi sintaksisga ega:

Chet el kaliti (ustun_name_which_ex_external_key) FOYDALANILGAN MA'LUMOTLAR parent_table_name (parent_column_name);

Id_author tashqi kalit ekanligini ko'rsataylik:

Id_topic int (10) AUTO_INCREMENT
theme_name varchar (100) NULL EMAS
id_author int (10) NULL emas
ASOSIY KEY (id_topic)
CHET KEY (id_author) ADABIYATLAR foydalanuvchilari (id_user)

Jadval tayyor va uning oxirgi versiyasi quyidagicha:

Jadval mavzularini yaratish (
id_topic int (10) AUTO_INCREMENT,
theme_name varchar (100) NULL EMAS,

PRIMARY KEY (id_topic),
CHET KEY (id_author) ADABIYATLAR foydalanuvchilari (id_user)
);

Qolgan oxirgi jadval postlar. Bu erda hamma narsa bir xil, faqat ikkita xorijiy kalit:

Jadval yozuvlarini yaratish (
id_post int (10) AUTO_INCREMENT,
xabar matni NULL emas,
id_author int (10) NULL emas,
id_topic int (10) NULL emas,
PRIMARY KEY (id_post),
FOREIGN KEY (id_author) REFERANSLAR foydalanuvchilari (id_user),
Chet el kalitlari (id_topic) ADABIYOTLAR mavzulari (id_topic)
);

Iltimos, esda tutingki, jadvalda bir nechta chet el kalitlari bo'lishi mumkin va MySQL-da bitta asosiy kalit bo'lishi mumkin. Birinchi darsda biz forum ma'lumotlar bazasini o'chirib tashladik, uni qayta yaratish vaqti keldi.

Biz MySQL serverini ishga tushiramiz (Boshlash - Dasturlar - MySQL - MySQL Server 5.1 - MySQL buyruq qatori mijozi), parolni kiritamiz, forum ma'lumotlar bazasini yaratamiz (ma'lumotlar bazasi forumini yaratamiz;), uni ishlatish uchun tanlaymiz (forumdan foydalaning;) va uchta jadvalimizni yaratamiz:

E'tibor bering, bitta buyruqni Enter tugmachasi yordamida bir nechta satrlarda yozish mumkin (MySQL avtomatik ravishda yangi satr belgisini -\u003e o'rnini bosadi) va faqat ajratuvchi (nuqta-vergul) dan so'ng Enter tugmachasini bosish so'rovni bajaradi.

Esingizda bo'lsa, agar siz noto'g'ri ish qilgan bo'lsangiz, har doim DROP bayonoti yordamida jadvalni yoki butun ma'lumotlar bazasini tashlab qo'yishingiz mumkin. Buyruqning satrida biror narsani tuzatish juda noqulay, shuning uchun ba'zida (ayniqsa, dastlabki bosqichda) so'rovlarni ba'zi muharrirlarda, masalan, bloknotda yozish, keyin ularni qora oynaga nusxalash va joylashtirish osonroq bo'ladi.

Shunday qilib, jadvallar bunga ishonch hosil qilish uchun yaratilgan, buyruqni eslaylik jadvallarni ko'rsatish:

Va nihoyat, so'nggi xabarlar jadvalimiz tuzilishini ko'rib chiqamiz:

Endi DEFAULT maydonidan tashqari strukturaning barcha maydonlarining qiymatlari aniq bo'ladi. Bu standart qiymat maydoni. Biz har qanday ustun (yoki hamma uchun) uchun standart qiymatni belgilashimiz mumkin. Masalan, agar bizda "Uylangan \\ Uylangan" deb nomlangan va ENUM turidagi maydon ("ha", "yo'q") bo'lsa, unda qiymatlardan birini odatiy qilib qo'yish oqilona bo'ladi. Sintaksis quyidagicha bo'ladi:

Uylangan enum ("ha", "yo'q") NULL emas ("ha")

O'sha. ushbu kalit so'z ma'lumotlar turidan keyin bo'sh joy bilan ajratiladi va standart qiymat qavs ichida ko'rsatiladi.

Ammo bizning jadvallarimizga qayting. Endi jadvallarimizga ma'lumotlarni kiritishimiz kerak. Veb-saytlarda siz odatda qandaydir HTML-shakllarga ma'lumot kiritasiz, so'ngra ba'zi bir tillarda skript (php, java ...) ushbu ma'lumotlarni formadan ajratib olib ma'lumotlar bazasiga kiritadi. Buni ma'lumotlar bazasiga ma'lumotlarni kiritish uchun SQL so'rovi yordamida amalga oshiradi. PHP-da skriptlarni qanday yozishni hali bilmaymiz, ammo endi ma'lumotlarni kiritish uchun SQL so'rovlarini yuborishni o'rganamiz.

Buning uchun operatordan foydalaning KIRITMOQ... Sintaksisning ikki turi mavjud. Birinchi variant jadvalning barcha maydonlariga ma'lumotlarni kiritish uchun ishlatiladi:

INSERT INTO table_name VALUES ("first_column_value", "second_column_value", ..., "last_column_value");


Keling, foydalanuvchilar jadvaliga quyidagi qiymatlarni qo'shishga harakat qilaylik:

INSERT INTO VALUES foydalanuvchilariga ("1", "sergey", " [elektron pochta bilan himoyalangan]", "1111");

Ikkinchi variant jadvalning ba'zi maydonlariga ma'lumotlarni kiritish uchun ishlatiladi:

INSERT INTO table_name ("column_name", "column_name") VALUES ("first_column_value", "second_column_value");


Bizning foydalanuvchilar jadvalimizda barcha maydonlar talab qilinadi, lekin bizning birinchi maydonimizda AUTO_INCREMENT (ya'ni avtomatik ravishda to'ldiriladi) kalit so'zi mavjud, shuning uchun biz ushbu ustunni o'tkazib yuborishimiz mumkin:

INSERT INTO foydalanuvchilariga (ism, elektron pochta, parol) VALUES ("valera", " [elektron pochta bilan himoyalangan]", "2222");

Agar bizda NULL tipidagi maydonlar bo'lsa, ya'ni. ixtiyoriy, biz ularni e'tiborsiz qoldirishimiz mumkin. Ammo maydonni NOT NULL qiymati bilan bo'sh qoldirishga harakat qilsangiz, server xato xabari chiqaradi va so'rovni bajarmaydi. Bundan tashqari, ma'lumotlarni kiritishda server jadvallar o'rtasidagi munosabatlarni tekshiradi. Shuning uchun siz tegishli jadvalda bo'lmagan chet el kalit maydoniga qiymat kiritolmaysiz. Qolgan ikkita jadvalga ma'lumotlarni kiritish orqali bunga amin bo'lasiz.

Avvalo, yana bir nechta foydalanuvchilar haqida ma'lumot qo'shamiz. Bir vaqtning o'zida bir nechta satrlarni qo'shish uchun vertikal bilan ajratilgan qavslarni ro'yxatlash kifoya:

Endi biz ma'lumotlarni ikkinchi jadvalga kiritamiz - mavzular (mavzular). Hammasi bir xil, lekin id_author maydonidagi qiymatlar foydalanuvchilar jadvalida bo'lishi kerakligini unutmang:

Keling, yana bitta mavzu qo'shishga harakat qilaylik, lekin id_author bilan, bu foydalanuvchilar jadvalida yo'q (chunki biz foydalanuvchilar jadvaliga faqat 5 foydalanuvchini qo'shdik, id \u003d 6 mavjud emas):

Server xatoga yo'l qo'ydi va bunday qatorga kira olmasligini aytdi, chunki tashqi kalit maydonida bog'langan foydalanuvchilar jadvalida mavjud bo'lmagan qiymat mavjud.

Endi postlar jadvaliga bir nechta qatorlarni qo'shib qo'yamiz, unda bizda 2 ta chet el kalitlari borligini, ya'ni. Biz qo'shadigan id_author va id_topic ular bilan bog'liq jadvallarda bo'lishi kerak:

Shunday qilib, bizda ma'lumotlar mavjud bo'lgan 3 ta jadval mavjud. Savol jadvallarda qanday ma'lumotlar saqlanganligini qanday ko'rishdir. Keyingi darsda buni qilamiz.

Savol: jadvallarni sql so'rovlari bilan to'ldirish


ehtimol xakerlik mavzusi, ammo baribir ... so'rovlar yordamida jadvallarni to'ldirish .. muammolar paydo bo'ldi ... menga nima noto'g'ri ekanligini tushunishga yordam bering. "Vodopostachannya" ma'lumotlar bazasini yaratishingiz kerak
faylga biriktirilgan so'rovlar yordamida yaratilgan jadvallar ..
ularni to'ldirishni boshladi, yana so'rovlar va xatolar yordamida ko'tarila boshladi ...
1-xato:
TBudinki jadvalidan tApartments jadvali uchun umumiy ma'lumotlarni to'ldirish uchun so'rov yozyapman:

T ga qo'shish
xatoni taqillatdi "INSERT INTO bayonotida #budinku maydoni uchun noma'lum nom mavjud. Ism xatolarsiz ko'rsatilganligiga ishonch hosil qiling va qaytadan urinib ko'ring."
so'rovga biror narsa qo'shmadimmi? bu xatoni qanday tuzatish kerak ???

2-xato
tTariff jadvalini ruchkalar bilan to'ldirdim .. endi tOplaty_plan jadvaliga o'tish uchun sizga ushbu jadvaldagi so'nggi tarif bo'yicha umumiy ma'lumotlar kerak ..
Max funktsiyasidan foydalangan holda so'nggi tarif bo'yicha so'rov quyidagicha ko'rinadi:
SELECT Date_installation, Rate1 people, rate_code FROM tRates WHERE Date_installed \u003d (SELECT MAX (Date_installed) FROM (tRate));
alohida so'rov sifatida u ishlaydi, lekin men tushunganimdek, ushbu so'rovdan tarif_code qiymati toPayment_plan jadvaliga ko'chirilishi kerak, ya'ni. Men quyidagi so'rovni yaratmoqdaman:

INSERT INTO to'lov_ rejasiga (tarif_kodu) SEFT tarif_kodini FROM tTariff WHERE (SELECT tarifi_code FROM tTariff WHERE Date_installed \u003d (SELECT MAX (Date_installed) FROM (tTariff)));

lekin bu erda xato (men bu erga rasmlarni qanday tashlashni bilolmadim, lekin umid qilamanki bu aniq bo'lib qoladi):

men nima qilyapman ??? iltimos, ayting ... aks holda choynakka xatolarini tuzatish qiyin

Fayl xabarga biriktirilgan ( in.txt - 2Kb)

Javob: lisica198808,

Birinchi so'rovda siz, ehtimol tuzilishga ega bo'lasiz (ustunlar soni va turlari) tApartments va tBudinks mos kelmaydi. Yulduzcha o'rniga tApartments-da ishlatmoqchi bo'lgan tBudinki jadvalidagi ushbu ustunlar nomlarini SELECT-da aniq ro'yxat.

Ikkinchi so'rovda, ehtimol sizning toPayment_plan-da bir nechta ustunlaringiz bor, ularning ba'zilari bekor bo'lmaydi. Siz faqat bitta ustunga (tarif_code) qiymat qo'shasiz, qolgan qismida sizda mavjud bo'lgan so'rov bilan standart qiymatlar (agar ular aniqlangan bo'lsa) yoki NULL o'rniga qo'yiladi. Shuning uchun xato.

SDKUning maslahatiga quloq soling.

Savol: Jadvalni to'ldirishda hisoblagich bilan bog'liq muammolar


Xayrli kun
Hisoblagich maydoni bo'lgan jadvalni to'ldirish uchun protsedura qilyapman
SET IDENTITY_INSERT dbo Clients ON-ni qo'shganimga qaramay, xato yuz beradi
T-SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 alter proc [dbo]. [Add_Client] @fiok varchar (50), @telk varchar (50), @skidk char (3) ni e'lon qilib @kklient int set @kklient \u003d (dbo.Clients-dan max (Client_code) -ni tanlang) + 1 SET IDENTITY_INSERT dbo. ON Mijozlar dbo qo'shadi. Mijozlar qiymatlari (@kklient, @fiok, @telk, @skidk) SET IDENTITY_INSERT dbo. OFF ni tanlang Mijozlar "Qo'shilgan mijoz:" + @fiok + "Tel:" + @telk + "Chegirma:" + @skidk

Xato - "dbo.Clients" jadvalidagi identifikator ustunining qiymati faqat ustunlar ro'yxatidan foydalanilganda va IDENTITY_INSERT ON holatida aniq ko'rsatilishi mumkin.

Javob:

Xabar _JoNi_

Men buni sinab ko'rdim, endi buni amalga oshirganda beradi
Men ahmoqona savollarim uchun uzr so'rayman, faqat sql o'rganishni boshladim)

Siz kiritayotgan jadval nomidan keyin maydon nomlarini vergul bilan ajratilgan qavs ichiga yozishingiz mumkinmi?!

Savol: So'zlar jadvalini kirish so'rovidan olingan ma'lumotlar bilan to'ldirish - echim izlash


Salom, yaxshi odamlar!

Internetda biron bir joyda, Word jadvalini xatcho'plar yordamida Access ma'lumotlari bilan to'ldirishning ishchi namunasini topdim. U ishlaydi (Example.zip).
Afsuski, men Access-da o'zim o'qituvchiman va ko'p narsalarni bilmayman ...
Ma'lumotlar bazasida (WORD.zip) ishlaydigan misoldan echimni qanday tatbiq etishga harakat qilsam ham, men uchun hech narsa ishlamaydi.
Men misoldan elementlarni funktsiyalar shaklida kiritaman, chunki u unda amalga oshiriladi va ularga murojaat qilaman - barchaga qasam ichaman.
Men ushbu funktsiyalarning ayrim qismlarini o'zimning kodimga kiritaman - yana qasam ichadi!

Jadvalga kiritmaslik kerak bo'lgan narsa, u xatcho'plar o'rniga ajoyib tarzda almashtiriladi (agar siz jadvalni to'ldirish bilan bog'liq barcha narsalarni olib tashlasangiz ishlaydi).

Mening kuchim yo'qoldi

Iltimos, yaxshi odamlar, mening kodimni tuzating, shunda hammasi ishlaydi!
Agar siz nima uchun muvaffaqiyatsiz bo'lganimni aniq tushuntirib bersangiz, men sizni eng dono va eng sezgir deb o'qiyman
Access2010

Oldindan rahmat!!!

P.S. Ma'lumotlar bazamda Moskva ko'chalari, familiyalari, ismlari, otasining ismi, o'lchov birligi (rasmiy qisqartmalar) ko'rsatilgan jadvallar mavjud - kimga kerak bo'lsa ishlating

Javob: keyin 2 qatordan keyin tanaffus bo'ladi (qo'shish satrida)
--
Kecha ishlash uchun ushbu ikkinchi variantni ololmadim ( corbis... nuqta 2)
bir soat ichida birinchisi (asl nusxasi) ishontirildi (taxminan 10 ta xato)

Savol: Jadvalni ma'lumotlar bilan to'ldirishda xato


NewCompany ma'lumotlar bazasi yaratilgan, unda EmployeeSchema.Employee jadvali yaratilgan, muammo shundaki, jadvalni dasturiy ravishda to'ldirishda xatolar yuzaga keladi, chunki oxirgi ustun bo'sh qoldirilishi kerak.
Buni qanday tuzatishni bilmayman. Iltimos yordam bering.

Jadval yaratish
NewCompany_Ezh-dan foydalanish;
GO

Jadvalni yarating EmployeeSchema.Employee
EmpID int NOT NULL,
LName varchar (20) NULL emas,
FName varchar (20) NULL emas,
Sarlavha varchar (20) NULL,
Tug'ilgan sanasi NULL,
Tugatish sanasi NULL,
Ish haqi o'nligi (18, 2) NULL emas,
DepID int NOT NULL,
OrgNode iyerarxiyasi NULL,
GO

To'ldirish
NewCompany_Ezh-dan foydalanish;
GO
E'LON QILING @ bola iyerarxiyasi,
@manager hierarchyid \u003d hierarchyid :: GetRoot ()

Ildiz darajasi - direktor

(1, N "Ivanov", N "Ivan", N "Direktor", "1975-05-07", "2009-05-06", 30000.00, @manager)

Keyingi daraja - O'rinbosarlar

EmployeeSchema.Employee QADRIYATLARIGA INSERT
(2, N "Petrov", N "Peter", N "Direktor o'rinbosari", "1969-10-07", "2005-07-07", 25000.00, @child)

EmployeeSchema.Employee QADRIYATLARIGA INSERT
(3, N "Sidorov", N "Sidor", N "Direktor o'rinbosari", "1981-05-05", "2009-09-09", 25000.00, @child)

SELECT @child \u003d @ manager.GetDescendant (@child, NULL)

EmployeeSchema.Employee QADRIYATLARIGA INSERT
(4, N "Eremin", N "Erema", N "Direktor o'rinbosari", "1986-11-01", "2009-10-10", 25000.00, @child)

Ierarxiyaning keyingi darajasi
SELECT @manager \u003d OrgNode
EmployeeSchema.Employee Qaerda Empid \u003d 4
SELECT @child \u003d @ manager.GetDescendant (NULL, NULL)

EmployeeSchema.Employee QADRIYATLARIGA INSERT
(5, N "Aleksandrov", N "Aleksandr", N "Yordamchi", "1979-01-01", "2008-01-01", 20000.00, @child)

SELECT @child \u003d @ manager.GetDescendant (@child, NULL)
EmployeeSchema.Employee QADRIYATLARIGA INSERT
(6, N "Andreev", N "Andrey", N "Yordamchi", "1985-04-12", "2008-01-01", 20000.00, @child)
GO

Javob:

Xabar Margaret98

NewCompany ma'lumotlar bazasi yaratildi

Bu, albatta, MS SQL haqida emas, balki MySQL haqida

Savol: Jadvalni to'ldirishda xato # 1062


hayrli kun.
Iltimos, jadvalni to'ldirishda muammoni hal qilishda menga yordam bering, u quyidagi xatolarni keltirib chiqaradi:
,
Asosiy kalit - ko'rsatilgan.
Agar siz id_zanyt (pk) ni to'ldirishda 1 dan emas, balki 2 dan boshlasangiz, unda xato bo'lmaydi ...

Javob: Hammasi hal qilindi!)) Mavzuni o'chirish kerak!

Savol: Ma'lumotlar bazasidagi jadvalni maydondan (TextBox) formada to'ldirish


Salom, men Internetda TextBox-dan jadvalni formada to'ldirish mavzusini qidirib topdim va bir maqolaga duch keldim.

va nima uchun uni ro'yxatdan o'tkazishingiz kerakligini tushunmadingizmi? agar shakl va jadval bir xil ma'lumotlar bazasida bo'lsa, kodning bu qismi boshqacha ko'rinishga ega bo'ladimi?
Dim z As New OleDb.OleDbConnection sifatida ( "Provayder \u003d Microsoft.Jet.OLEDB.4.0; Ma'lumot manbai \u003d C: 1 Microsoft Office Access.mdb") "Ma'lumotlar bazasiga ulanishni o'rnatish. z.Ochiq () "Ulanishni ochish.
va ikkinchisi

Dim t As New OleDb.OleDbCommand (Yangi OleDb.OleDbCommand kabi) "UPDATE [Jadval1] SET [Field1] \u003d" " & "" & TextBox1.Text & "" QAYERDA [Kod] \u003d 1 ", z)
nega z o'zgaruvchisi kerak?

Savol: Jadvallarni avtomatik ravishda to'ldirish


Salom
Iltimos aytolmaysizmi
sql-dagi jadvalim bor. 3 ta ustun (maydon) birinchisi avtomatik ravishda to'ldiriladi
So'rov yordamida 2 va 3 maydonlarni to'ldirmoqchiman
shunday qilib, 2-maydon 0 dan 99 gacha, 3 qadam bilan
3 maydon 3 dan 102 gacha, 3 bosqichda
ya'ni darhol to'ldirilgan katta stolni olish
Men qanday qilib so'rov yuborishni tushunmayapman
harakat qildi
asosiy nomdan foydalaning;
Runnums-ga qo'shish (field2, field3)
qiymatlar (0,3)
ammo bu faqat bitta qatorni to'ldiradi
oldindan rahmat
Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: