Gurzi Posted October 12, 2006 at 08:46 PM Report #56824 Posted October 12, 2006 at 08:46 PM Preciso aqui de uma ajuda.. Tenho 2 tabelas no qual uma é Autor e outra Livros.. Ou seja cada uma tem um ID e como é uma ligação de muitos para muitos, vai ser criado uma terceira tabela que vai receber o ID da tabela autor e da tabela Livro .. mas como faço ao criar a tabela Autoria dizer que o ID AUTOR e o ID LIVRO são os IDS das outras tabelas fazendo assim uma ligaçao muitos para muitos ?
shumy Posted October 12, 2006 at 10:00 PM Report #56840 Posted October 12, 2006 at 10:00 PM Não percebi muito bem o que queres! Ligar as tabelas com constraint? Isto? create table [dbo].[Autor]( [iDAutor] int primary key identity(1,1) not null ) GO create table [dbo].[AutorLivro] ( [RefIDLivro] int not null, [RefIDAutor] int not null, constraint [PK_AutorLivro] primary key clustered ( [RefIDLivro], [RefIDAutor] ) ) GO CREATE TABLE [dbo].[Livro] ( [iDLivro] int primary key identity(1,1) not null ) GO alter table [dbo].[AutorLivro] add constraint [FK_AutorLivro_Autor] foreign key ( [RefIDLivro] ) references [dbo].[Livro] ( [iDLivro] ), constraint [FK_AutorLivro_Livro] foreign key ( [RefIDAutor] ) references [dbo].[Autor] ( [iDAutor] ) GO Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Gurzi Posted October 12, 2006 at 10:29 PM Author Report #56844 Posted October 12, 2006 at 10:29 PM não sei.. é que tipo.. a tabela Autor liga a Livros e é uma ligaçao de muitos para muitos... Quando é uma ligação de muitos para muitos é criada uma terceira tabela que recebe as 2 chaves primárias de cada tabela.. só que como é que faço essa 3 tabela e indico que os campos la dentro sao as chaves primárias das outras duas ?
Saco Posted October 12, 2006 at 10:43 PM Report #56849 Posted October 12, 2006 at 10:43 PM Não sei qual é a base de dados que estás a usar, mas em SQL existem as Chaves estrangeiras (foreign keys), suponho que existam nas outras também, porque é uma coisa básica.
shumy Posted October 12, 2006 at 10:57 PM Report #56852 Posted October 12, 2006 at 10:57 PM É o que está no código então. A associação das chaves está na parte ALTER TABLE. A 3ª tabela é o tal AutorLivro. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Saco Posted October 12, 2006 at 11:05 PM Report #56853 Posted October 12, 2006 at 11:05 PM Realmente... está lá FOREIGN KEY... eu é que vi tantas letras que nem me dei ao trabalho de ler Mas pronto, acho que é assim que se faz uma ligação de muitos para muitos... Já agora isso é o quê? Access? parece muito mais complicado do que SQLSERVER (ou sou eu que já não me lembro como se criavam tabelas em SQLSERVER?)
shumy Posted October 12, 2006 at 11:40 PM Report #56863 Posted October 12, 2006 at 11:40 PM SQL server. É provavel que muita gente junte o código que está em ALTER TABLE na propria criação da tabela. Eu gosto mais assim, porque quando temos tabelas aos montes não somos obrigados a respeitar a ordem de criação. É que se juntares o código, e por algum motivo tentares criar as tabelas na ordem que estão... estoira! Porque Livro não existe e AutorLivro refere a tabela Livro. Já vi muitas pessoas a tentar ordenar a criação das tabelas num script com tabelas a dar com pau, e a ficar xone com aquilo. Assim basta colocar todos os ALTER TABLE no fim do script e a coisa funciona sempre. As referências são sempre para tabelas já criadas. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Saco Posted October 12, 2006 at 11:57 PM Report #56869 Posted October 12, 2006 at 11:57 PM Tá muito bem visto, sim senhor 😛
Gurzi Posted October 13, 2006 at 10:00 PM Author Report #57076 Posted October 13, 2006 at 10:00 PM Obrigado shumy, so nao percebo o que é o dbo. O porquê da utilização das [] e o que serve o constraint e clustered , vou procurar! já entendi que os contrains são restrições mas nos exemplos que vi não usam a palavra constrain.. ainda não sei o que é o dbo e o clustered !
shumy Posted October 15, 2006 at 10:39 PM Report #57682 Posted October 15, 2006 at 10:39 PM dbo -> database owner(dono da base de dados) normalmente o grupo a que pertecem os criadores da bd e que têm previlegios para executar todo o tipo de operações sobre aquela BD. Convem criar todos os objectos com dbo.* para que os previlegos importantes (como criar e apagar tabelas) estejam restringidos aos dbo's. [] -> obrigatoriamente usados em nomes que contenham espaços, mas opcional noutros tipos. Como norma é uma bom abito usalos. clustered -> usado por questões de performance, a explicação pode ser um pouco extensa por isso resumidamente, provoca uma ordenação do campo com essa propriadade aumentando a performance de algumas pesquisas. Aumenta essencialmente pesquisas que devolvam um range de dados, e especialmente em situações em que se usa 'between'. A aceleração deve-se ao facto de dados com valores iguais, ou parecidos, estarem perto uns dos outros, basicamente em ingles (clustered) juntos. Espero que tenha sido util. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Gurzi Posted October 16, 2006 at 08:51 PM Author Report #57904 Posted October 16, 2006 at 08:51 PM Só nao entendo o porque de fazeres [dbo] . [Autor] .. o Autor n é o nome da tabela ? entao pk o . ? Outra coisa, o que é o identity (1,1) ?? e porque usas alter table e nao fazes logo tudo no create ? Para finalizar o que está em AutorLivro n devia ter o mesmo nome que o que vem da tabela autor e livro ? é que chamaste IDAutor e depis puseste RefIDAutor
Gurzi Posted October 16, 2006 at 09:11 PM Author Report #57923 Posted October 16, 2006 at 09:11 PM Ficaria assim entao ? 😉 CREATE TABLE [dbo].[Autor] ( [iDAutor] int PRIMARY KEY NOT NULL AUTO_INCREMENT, [Nome] CHAR(255) NOT NULL, [Apelido] CHAR(255) NOT NULL) GO CREATE TABLE [dbo] . [Autoria] ( [iDAutor] int NOT NULL, [iDLivro] int NOT NULL, CONTRAINT [FK_AutorLivro] PRIMARY KEY CLUSTERED ( [iDAutor], [iDLivro] ) ) GO CREATE TABLE [dbo] . [Livro] ( [iDLivro] int PRIMARY KEY NOT NULL AUTO_INCREMENT, [Editora] CHAR(50) NOT NULL , [Edicao] int NOT NULL, [Ano] int NOT NULL ) GO ALTER TABLE [dbo] . [AutorLivro] ADD CONSTRAINT [FK_AutorLivro_Autor] FOREIGN KEY ( [iDLivro] ) REFERENCES [dbo].[Livro] ( [iDLivro] ), CONSTRAINT [FK_AutorLivro_Livro] FOREIGN KEY ( [iDAutor] ) REFERENCES [dbo].[Autor] ( [iDAutor] ) GO
shumy Posted October 16, 2006 at 09:32 PM Report #57936 Posted October 16, 2006 at 09:32 PM Epá tanta questão! Ponto para separar nomes é como nas linguagens orientadas a objectos! dbo.X, dbo.Y tabela X e Y pertencentes ao grupo dbo. identity (1,1) é indica que o campo é incrementado automaticamente de 1 em 1 com inicio em 1. Não presisas de inserir esse campo nos inserts, é automático. Quanto ao alter table já foi explicado anteriormente. Quando tiveres muitos create tables com referências, experimenta trocar a ordem de criação para ver o que acontece. Se tiveres muitas mesmo vas te ver lixado para por aquilo a funcionar outra vez. IDAutor -> chave primária. RefIDAutor -> chave estrangeira, ou seja referencia outra chave primária (Ref -> referência a!) é uma convenção usada por mim para manter as coisas em ordem. Podes utilizar outra convenção qualquer. Mas aconselho a separar as coisas. É que as chaves primárias garentem que são unicas e as estrangeiras não. Se tiveres o mesmo nome podes-te enganar a fazer alguma query, partindo do pressuposto que aquele campo deveria ser unico. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now