webForumDet fria alternativet

grundtabell som uppdaterar andra tabeller..

Databaser & SQL

11 svar · 244 visningar · startad av tlee

Medlem sedan mars 2001290 inlägg
Frågan#1

Tjena!

Jag har ett artikelregister i en SQL2000 i en tabell som heter: tbl_Products. Denna tabell är en 'Master' tabell dvs den skall pappa till alla andra tabeller.

Nu vill jag ha några 'Child' tabeller som innehåller några av de fälten som finns i 'Master' tabellen.

Alltså..

Om jag uppdaterar någonting i Master tabellen så skall det även uppdateras i Child tabellen., är ni med ?

Det måste ju finnas någon inbyggd funktion för detta i SQL 2000, typ länkad tabell eller något ?

säg till om ni vill att jag utvecklar min fråga :))

/tobias

------------------
the man with the golden bottle..

Medlem sedan dec. 200012 464 inlägg
#2

Nu förstår jag inte riktigt. Grundiden med en relationsdatabas är ju att man bara lagrar informationen på ett ställe.

Det enda som ska finnas duplicerat är de nycklar som sammanbinder posterna och nycklar skall man ju aldrig uppdatera (Det kan man i och för sig hantera med hjälp av on update cascade när man definierar sina foreign keys).

Om man nu vill att en uppdatering leder till en uppde/insert i en annan tabell så kan man skapa en trigger för det ändamålet eller så hanterar man det själv och då enklast i en stored procedure.

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2001290 inlägg
#3

okej..

jag vet inte alls hur det funkar med relationer och grejer..så om du har en tutorial eller någtot som man kan läsa så vore det uppskattat.

Hur funkar det om man använder relationer, kan man använda vanliga sql satser?

ett litet exempel ...

tabell_1.Name = 'kalle'
tabell_2.Name > tabell_1.Name

tabell_1.Name = Master tabell
tabell_2.Name är länkad/pekar till tabell_1.Name

SELECT tabell_1.Name, tabell_2.Name;

Och om jag skriver ut detta så kommer båda visa " kalle "

är du med på vad jag menar ?

/t

------------------
the man with the golden bottle..

[Redigerat av tlee den 07 aug 2001]

Medlem sedan mars 2001290 inlägg
#4

Mina två tabeller som skall ha en relation mellan sig ser ut såhär

tbl_Products:
ID (PRIMARY KEY)
col_ArticleNr
col_Name
col_Group
col_Price

tbl_Test:
ID (PRIMARY KEY)
col_ArticleNr
col_Name
col_Group
col_Price
col_Price_1
col_Price_2
col_Price_3
col_Price_4
col_Price_5

Alla kolumner har samma datatyp och längd i båda tabellerna.

Några frågor...

1. I Vilken tabell skall jag skapa relationen (tbl_Products, tbl_Test)?
2. Alla kolumner skall ju inte ha någon relation utan bara vara vanliga celler, kan jag lägga till med INSERT där relation saknas?
3. Viken tabell skall vara Primary key table resp Foreign key table?
4. Vilka av dessa skall vara ikryssade:
Check existing data on creation
Enforce relationship for replication
Enforce relationship for INSERTs and UPDATEs
Cascade Update Related Fields
Cascade Delete Related Fields

/tobias

Medlem sedan dec. 200012 464 inlägg
#5

Du vill alltså ha artiklar och sedan för varje artikel vill du kunna lagra ett antal
olika prisuppgifter.

I så fall skulle jag definiera tabellerna så här


  create table aritcles(col_articleNo int identity,
                        col_articleName varchar(40),
                        col_group varchar(40),
                        primary key(col_articleNo))

  create table articlePrices(col_articleNo int,
                             col_priceType char(10),
                             col_price decimal(8,2),
                             primary key(col_articleNo,col_priceType),
                             foreign key (col_articleNo) references
                             articles(col_articleNo))

Då kan man hantera att en artikel har ett godtyckligt antal priser. I och med
att du har en foreign key koppling mellan tabellerna så går det inte att stoppa in
ett värde i col_articleNo i tabellen articlePrices om inte motsvarande värde finns
i tabellen articles.

Alternativt kan man i den senare tabelldefinitionen lägga till

create table articlePrices(col_articleNo int,
                             col_priceType char(10),
                             col_price decimal(8,2),
                             primary key(col_articleNo,col_priceType),
                             foreign key (col_articleNo) references
                             articles(col_articleNo) 
                             on delete cascade )

Det innebär att om man tar bort en post från tabellen articles så kommer
de poster i articlePrices som har samma col_articleNo också att tas bort.
Om man inte anger on delete cascade så får man ett fel om man försöker
ta bort en post från articles och det finns en post med det värdet i
articlePrices.
On update cascade fungerar analogt.

Hur det här hänger ihop med de kryssrutor du beskrev vet jag inte. Jag kan bara SQL.

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2001290 inlägg
#6

hmm.. okej.. får det att fungera ok nu, när jag går in och updaterar eller tar bort ur min master tabell så ändras/tas det bort även i min andra tabell.. vilket är schysst :))

Ytterligate frågor,
Hur många tabeller kan jag ha en relation till, finns det någon gräns?

Det verkar inte funka om jag lägger till något i min master databas så läggs det inte till i min child databas?

Hur kan jag lösa det ?

/t

Medlem sedan dec. 200012 464 inlägg
#7

Gränser, jag har inga direkta siffror i huvudet men det skall inte vara något praktiskt problem.

Lägga till data i foreign-key tabellen får du hantera själv, det finns ingen automatik för det.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 08 aug 2001]

Medlem sedan mars 2001290 inlägg
#8

okej.. det är ju konstigt att inte det finns.. det får dom fixa.. aja..

Hur löser jag det smidigast?

Kan jag använda en trigger eller något som när det läggs in något i Master tabellen, läser från en lista namnen på de tabeller där samma information skall läggas in?

Har du någon länk eller något till en tutorial med såna grejer.. Har bara använt SELECT, DELETE och UPDATE innan :)

/t

Medlem sedan dec. 200012 464 inlägg
#9

Jo en trigger visst. Men jag tycker fortfarande att din datamodell är suspekt om du har behov av att lagra samma data i flera tabeller.

Create trigger:
http://msdn.microsoft.com/library/default.asp?url=/nhp/Default.asp?contentid=28000409

Du kan ju även söka på msdn på begrepp som

normailzation (ev normalisation)
foreign keys
referential integrity

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2001290 inlägg
#10

Tjena..

nytt problem.. vet inte om det beror på mina relationer mellan tabellerna eller vad det är..

here we go..

UPDATE [tbl_Fonem_Groups] SET [col_Visible] = 'checked', [col_Price_1] = 10, [col_Price_2] = 20, [col_Price_3] = 30, [col_Price_4] = 40, [col_Price_5] = 50 WHERE [col_Name] = 'BOX';

I SQL Query Analyzer får jag följande fel:
Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'tbl_Fonem_Groups'.

Grejen är den att tabellen finns.. och dom fälten som jag försöker uppdatera har ingen relation med någon annan tabell utan är helt vanliga..

Är det någon inställning som jag behöver göra ?

/t

Medlem sedan dec. 200012 464 inlägg
#11

Nej, det är bara att den inte hittar tabellen. Har du satt rätt databas och schema?

------------------
essentitia preter non sans multiplicandum

Medlem sedan mars 2001290 inlägg
#12
<%
Connect.Open "Provider=SQLOLEDB; Data Source=90.0.0.101; Initial Catalog=arlec_se; User ID=arlec_se; Password=zzzxxzzz;"

strUser = Request.KAKA("User")("Name")
strGroup = Trim(Request.QueryString("Group"))

strVisible = Request.Form("txtActive")

If ( strVisible = "on" ) Then _
	strVisible = "checked"

strPrice_1 = Request.Form("txtPrice1")
strPrice_2 = Request.Form("txtPrice2")
strPrice_3 = Request.Form("txtPrice3")
strPrice_4 = Request.Form("txtPrice4")
strPrice_5 = Request.Form("txtPrice5")

If ( Trim(strUser) > "" & "" ) Then

	
Set DB_QUERY = Connect.Execute("UPDATE [tbl_"& strUser &"_Groups] SET [col_Visisble] = '"& strVisible &"'" &_
					", [col_Price_1] = "& strPrice_1 &"" &_
					", [col_Price_2] = "& strPrice_2 &"" &_
					", [col_Price_3] = "& strPrice_3 &"" &_
					", [col_Price_4] = "& strPrice_4 &"" &_
					", [col_Price_5] = "& strPrice_5 &" WHERE [col_Name] = '"& strGroup &"';")

Det är den koden jag använder, samma connect string fungerar när jag skall läsa från databasen..

/t

------------------
the man with the golden bottle..

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)