Sql外键

时间:2011-11-01 22:56:34

标签: sql sql-server sql-server-2005 sql-server-2008

我正在尝试将40个txt文档存储在数据库中。首先,我创建了一个包含文件ID和名称的表。其次,我创建了一个表(WORDS),它将存储所有40个txt文件的内容(逐字逐句)。我需要在表(WORDS)中创建一个外键,以将每个单词引用到找到它的原始文件。

显然这将是困难的如果我手动完成,因为可能有一百万字。

我的第一个问题:我有什么方法可以自动执行此方法吗?使用SQL查询?

我的第二个问题:sql server如何区分哪个单词最初在哪个文件中?

1 个答案:

答案 0 :(得分:0)

Sql Server(以及许多其他数据库)本身支持全文搜索,这将是一个比你提议的更好的解决方案。

请参阅http://msdn.microsoft.com/en-us/library/ms142571.aspx

那就是说,如果你真的需要你的方法,你可以做类似以下的事情:

CREATE table fileTable 
(
    ID int identity,
    nameOfFile nvarchar(200),
    PRIMARY KEY (ID),
    UNIQUE(nameOfFile)
)
GO

CREATE table words
(
    ID int identity,
    word nvarchar(200),
    PRIMARY KEY(ID),
    UNIQUE(word)
)
GO

CREATE table file_words
(
    fileId int,
    wordId int,
    FOREIGN KEY (fileId) REFERENCES fileTable(ID),
    FOREIGN KEY (wordId) REFERENCES words(ID),
    UNIQUE(fileId,wordId)
)
GO

declare @fileContents nvarchar(max)
SET @fileContents = 'Hello world.  I am a silly word splitter.'
declare @fileName nvarchar(200)
SET @fileName = 'HelloSplitter.txt'


declare @whiteSpaceOrPunctuation table
(
    charVal nchar(1)
)

insert @whiteSpaceOrPunctuation
SELECT ' ' UNION ALL SELECT ',' UNION ALL SELECT ';' UNION ALL SELECT ':'
UNION ALL SELECT '-' UNION ALL SELECT '_'  UNION ALL SELECT '['  UNION ALL SELECT ']' 
UNION ALL SELECT '!' UNION ALL SELECT '.' UNION ALL SELECT '?' UNION ALL SELECT '%' 
UNION ALL SELECT '$' UNION ALL SELECT '#'
--etc...

declare @position int
declare @word nvarchar(max)
declare @fileLength int
declare @fileId int
declare @wordId int
SET @position = 1
SET @fileLength = LEN(@fileContents)
SET @word = ''
declare @currentChar nchar

INSERT fileTable (nameOfFile) VALUES (@fileName)

SELECT @fileId = SCOPE_IDENTITY()



while (@position <= @fileLength + 1)
BEGIN
    --print @position
    --print @fileLength

    SELECT @currentChar = SUBSTRING(@fileContents, @position, 1)

    --print @currentChar

    IF (EXISTS(SELECT 1 FROM @whiteSpaceOrPunctuation WHERE charVal = @currentChar) OR @position = @fileLength + 1)
    BEGIN
        --print 'word: ' + @word
        IF(@word <> '')
        BEGIN
            --print @word

            SELECT @wordId = ID FROM words where word=@word

            IF (@wordId IS NULL)
            BEGIN
                INSERT words (word) VALUES (@word)
                SELECT @wordId = SCOPE_IDENTITY()
            END

            IF (NOT EXISTS(SELECT 1 FROM file_words WHERE wordId = @wordId AND fileId=@fileId))
            BEGIN
                INSERT file_words (fileId, wordId) VALUES (@fileId, @wordId)
            END
            SET @word = ''
            SET @wordId = null
        END
    END
    ELSE BEGIN
        SELECT @word = @word + @currentChar
    END

    SELECT @position = @position + 1
END

--select * from fileTable
--select * from words
--select * from file_words

--drop table file_words
--drop table words
--drop table fileTable

请注意,这并未考虑大写与小写。您获得的行为可能取决于您的collation

此外,将所有这些包装在一个事务中是明智的,您可以直接在此脚本中或在用于进行数据库调用的任何编程API中执行此操作。